3.1 可见性

synchronized 不仅实现了原子性操作或者确定了临界区,而且确保内存可见性。

*****必须在同步中才能保证:当一个线程修改了对象状态之后,另一个线程可以看到发生的状态变化。

1.失效值问题

以上类非线程安全,get和set在非同步情况下获取value值。

当一个线程修改value,另一个线程可能得到更新后的值,也可能得不到。

对get和set进行同步,可以是成为线程安全类。

2. long或者double 需要用volatile修饰或者用锁保护。 因为64位值可能被拆为2个32位操作。

3.volatile 修饰变量,确保获取最新值。

加锁可以确保可见性和原子性,而volatile只能确保可见性。

可以被写入 volatile 变量的这些有效值独立任何程序的状态,包括变量的当前状态:

  • 对变量的写操作不依赖于当前值。
  • 该变量没有包含在具有其他变量的不变式中。

lower upper非独立于其他状态

3.2发布与逸出

发布:对象能够在当前作用域之外的代码中使用。

逸出: 某个不应该被发布的对象被发布。

3.3线程封闭

将某个对象封闭在某个线程中。举例:connection从线程池拿出给某个线程使用,且不会在分给其他线程。

java及核心库提供支持:例如 局部变量和ThreadLocal

但是程序员仍要确保封闭在线程中的对象不会从线程中逸出。

2栈封闭

局部变量的固有属性,就是封闭在执行的栈中。其他线程无法访问这个栈。但是编程要确保不逸出。

开发人员要给出注释那些对象需要封闭到执行线程中,便于以后维护时不会造成逸出。

3.threadlocal

3.4不变性

不可变对象一定是线程安全的。

满足以下条件时,对象才不可变:

1.对象创建以后其状态就不能修改。

2.对象的所有域都是final类型。

3.对象是正确创建的(对象的创建期间,this引用没有逸出)。

1.Final域

2.volatile类型来发布不可变对象(volatile+不可变对象)

当需要对一组数据以原子方式执行某些操作时,可以考虑创建一个不可变类来封装这些数据。如上例。

对于在访问和更新多个相关变量时出现的竞争性条件,通过将这些变量保存在一个不可变类中来消除。不可变对象,当线程获得该变量引用后,不必担心其他线程会修改该对象的状态。如果要更新该对象,可以创建    一个新的容器对象   。其他线程没有影响。

总结:将变化的封装在一个不变的容器类中,讲内容的变化改为创建一个新的容器。

3.5安全发布

上面讨论的是如何让对象不被发布,讲对象封闭在线程或者另一个对象中。但是有时需要在线程中共享对象,所以需要安全发布对象。

//在没有足够同步的情况下发布对象,不要这么做

public Holder holder;

public void intialize() {

  holder =  new Holder(42);

}

存在可见性问题,其他线程看到未被完全创建的对象。

1.不正确的发布:正确的对象被破坏

class Holder{

  private int n;

  public Holder(int n) {  this.n = n; }

  public void assertSanity() {

    if( n != n) {

      throw new AssertionError("this statement is error");

    }

  }

}

2.安全发布的常用模式:

3.事实不可变对象:

如果对象的状态在发布后不会在改变,称为事实不可变状态。

*********

线程安全共享:此类内部实现同步。

保护对象:使用时加锁。

java并发编程实战笔记---(第三章)对象的共享的更多相关文章

  1. 《Java并发编程实战》第三章 对象的共享 读书笔记

    一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见 ...

  2. java并发编程实战:第三章----对象的共享

    我们不仅仅希望防止某个线程使用某个状态时,另一个线程在修改它:我们还希望某个线程修改了某个状态后,其他线程能够看到状态的变化. 一.可见性 重排序:在没有同步的情况下,编译器.处理器可能对代码的执行顺 ...

  3. 《Java并发编程实战》第四章 对象的组合 读书笔记

    一.设计线程安全的类 在设计线程安全类的过程中,须要包括下面三个基本要素:  . 找出构成对象状态的全部变量.  . 找出约束状态变量的不变性条件.  . 建立对象状态的并发訪问管理策略. 分析对象的 ...

  4. java并发编程读书笔记(1)-- 对象的共享

    1. 一些原则 RIM(Remote Method Invocation):远程方法调用 Race Condition:竞态条件 Servlet要满足多个线程的调用,必须是线程安全的 远程对象,即通过 ...

  5. java并发编程实战笔记---(第二章)线程安全:正确性

    ThreadA__________     同步 ______________ 异步 ___________     异步 ThreadB__________         ____________ ...

  6. java并发编程实战:第四章----对象的组合

    一.设计线程安全的类 找出构造对象状态的所有变量(若变量为引用类型,还包括引用对象中的域) 约束状态变量的不变性条件 建立对象状态的并发访问管理策略(规定了如何维护线程安全性) 1.收集同步需求(找出 ...

  7. Java并发编程学习笔记(三)——对象的组合

    重要概念: 1.在设计线程安全类的过程中,需要包含以下三个基本要素: (1)找出构成对象状态的所有变量. (2)找出约束状态变量的不变性条件. (3)建立对象状态的并发访问管理策略. 2.

  8. Java并发编程学习笔记(二)——对象的共享

    主要概念:可见性.重排序.失效数据.最低安全性.发布.逸出.线程封闭(Ad-hoc.栈封闭.ThreadLocal类).不变性.Final域.事实不可变对象. 1.在没有同步的情况下,编译器.处理器以 ...

  9. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  10. Java并发编程实战.笔记十一(非阻塞同步机制)

    关于非阻塞算法CAS. 比较并交换CAS:CAS包含了3个操作数---需要读写的内存位置V,进行比较的值A和拟写入的新值B.当且仅当V的值等于A时,CAS才会通过原子的方式用新值B来更新V的值,否则不 ...

随机推荐

  1. PyCharm入门教程——在编辑器中打开和重新打开文件

    PyCharm最新版本下载 JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具.此外,该IDE提供了一些高级功能,以用于 ...

  2. Spring Boot系列教程一:Eclipse安装spring-tool-suite插件

    一.前言        一直使用eclipse,个人习惯选用Eclipse+spring-tool-suite进行开发,特别注意Eclipse要选用对应的spring-tool-suite进行安装,这 ...

  3. 常州day1p3

    给定一个 n 行 m 列的方格,每个格子里有一个正整数 a,1 ≤ a ≤ k,k ≤ n∗m 假设你当前时刻站在 (i,j) 这个格子里,你想要移动到 (x,y),那必须满足以下三个条件 1:i & ...

  4. 【BZOJ2437】【NOI2011】兔兔与蛋蛋(博弈论,二分图匹配)

    [BZOJ2437][NOI2011]兔兔与蛋蛋(博弈论,二分图匹配) 题面 BZOJ 题解 考虑一下暴力吧. 对于每个状态,无非就是要考虑它是否是必胜状态 这个直接用\(dfs\)爆搜即可. 这样子 ...

  5. 【BZOJ4152】The Captain(最短路)

    [BZOJ4152]The Captain(最短路) 题面 BZOJ Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求 ...

  6. Unity3D手游开发日记(7) - 适合移动平台的天气效果

    腾讯的天涯明月刀的天气很棒,以前我也在CE3的基础上做了一个效果差不多的,但是在手机上,还是斜下固定视角的游戏,是否还需要一个天气系统? 而且没有G-Buffer的支持,很多牛逼效果实现不了,比如角色 ...

  7. 【Nowcoder】玩游戏

    Portal --> Nowcoder197D Solution 所以说这是一道==纯粹的人类智慧题是这样吗qwq ​ 一开始的时候想sg函数qwq然后发现..好像根本不能拆成独立的子游戏嘛qw ...

  8. Struts初探(二)

    总是找不到对应的action,但别的没用到动态方法调用的都没有问题. 报异常:java.lang.reflect.InvocationTargetException - Class: com.open ...

  9. js 多个事件的绑定及移除(包括原生写法和 jquery 写法)

    需要打开控制台查看效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  10. C++并发编程 等待与唤醒

    C++并发编程 等待与唤醒 条件变量 条件变量, 包括(std::condition_variable 和 std::condition_variable_any) 定义在 condition_var ...