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

时间:2024-01-16 16:15:26

一、可见性
什么是可见性?
Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化。 后者就是可见性的描写叙述即多线程能够实时获取其它线程改动后的状态。
     *** 待补充   两个工人同一时候记录生产产品总数问题

1. 失效数据
可见性出现故障就是其它线程没有获取到改动后的状态,更直观的描写叙述就是其它线程获取到的数据是失效数据。

2. 非原子64位操作

3. 加锁与可见性
比如在一个变量的读取与+1上加入一把锁,锁保证了其它线程获取到此变量都是+1后的值,所以能够保证可见性。

4. Volatile变量
线程对共享变量的改动,对其它线程可见
满足下面条件,使用Volatitle:
对变量的写入操作不依赖变量的当前值,或者你能确保仅仅有单个线程更新变量的值。
该变量不会与其它状态变量一起纳入不变形条件中。
在訪问变量时不须要加锁。



二、公布 、逸出
公布一个对象的意思是指,使对象可以在当期作用域之外的代码中使用。
简单的能够理解为其它地方获取到当前类的对象,这样的情况就是公布当前类。
Java多线程不仅要确保当前类是线程安全的,并且须要保证使用当前类对象的全部地方都要保证线程安全性。


三、封装
线程封闭 - 把共享的数据,仅在线程中使用,不共享.比如java的ThreadLocal类
     Ad-hoc线程封闭 -- 维护线程封闭性的职责全然由程序实现承担.(非常脆弱)
     线程封闭 - 通常将特定子系统实现为一个单线程子系统
栈封闭
     线程封闭的特例, 比如基本类型的局部变量
ThreadLocal - 通常防止可变的单实例对象 或 全局变量进行共享.


四、不可变
final对象,本身不可改变,可是final中的变量却能够改变


五、安全公布方式:
1. 静态初始化函数中初始化一个对象引用
2. 将对象的引用保存到volatile类型的域或者AtomicReference对象中
3. 将对象的引用保存到某个正确的构造对象的final类型域中
4. 将对象的引用保存到一个由锁保护的域中