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 共享对象的主要内容,如果未能解决你的问题,请参考以下文章

Java并发.3对象的共享

Java并发编程:线程封闭--ThreadLocal

Java并发-对象共享

[Java并发编程实战] 对象的共享

[Java并发编程实战] 对象的共享

Java并发编程实战-阅读笔记02-对象的共享