Java并发 chapter3 共享对象
Posted qmc2077
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java并发 chapter3 共享对象相关的知识,希望对你有一定的参考价值。
可见性
对象引用的可见性与对象域可见性不同???
锁在保证原子性的同时保证了可见性
原子性通过引入不可分割的语义,保证了自身的执行的正确性,通过状态集不被其他线程修改。
可见性:自身的执行对状态的修改可能影响其他线程的约束。修改——可见存在延迟,可见性去除了其中的延迟。
提供可见性的状态维护了这组状态的一致快照
volatile提供可见性,但只针对原子性的读写操作
实现上不使用锁,线程不会阻塞
常用作状态标志
非复合:读写不可依赖于变量;不与其他变量构成约束(从而相关);访问变量时不需要加锁???双重可见性冗余了?
发布:可访问其引用
公共静态变量、非私有域、内部类发布外部类
安全的对象构造:当且仅当构造函数返回时,对象处于可预测的一致状态。构造过程中this引用不可逸出
线程封闭:
局部变量、ThreadLocal
//单个线程修改volatile变量
局部变量:基本类型:封闭;引用:须保证不逸出
ThreadLocal:每个线程保存变量的独立副本:如事务上下文
不变对象:
正确创建:不逸出
所有域final:确保初始化安全
不修改状态
//由volatile变量+引用不可变+引用可变变量提供弱原子性
以上将对象封闭在线程或对象内部,保证不发布
安全发布
//线程安全访问不可变对象
安全发布模式
安全发布一个对象,需对象的引用与对象的状态同时保证可见性
在静态初始化函数中初始化对象引用(在类初始化阶段执行,JVM内部提供同步机制)
引用保存在域:volatile或AtomicReference、正确构造对象的final域、锁保护
容器类提供安全发布:
Hashtable、synchronizedMap、ConcurrentMap 键值
Vector、synchronizedList、synchronizedSet、copyOnWriteArraySet、copyOnWriteArrayList
BlockingQueue、ConcurrentLinkedQueue
其他数据传递机制:Future、Exchanger
可变对象
安全发布只保证发布时的状态可见
对象访问需同步
不可变对象:任意方式发布
事实不可变对象:安全发布
可变对象:安全发布+线程安全或锁保护
以上是关于Java并发 chapter3 共享对象的主要内容,如果未能解决你的问题,请参考以下文章