码迷,mamicode.com
首页 > 编程语言 > 详细

Java并发 chapter3 共享对象

时间:2019-10-05 22:15:14      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:vector   atom   静态   存在   基本   容器类   cto   locking   hashtable   

可见性

对象引用的可见性与对象域可见性不同???

锁在保证原子性的同时保证了可见性

原子性通过引入不可分割的语义,保证了自身的执行的正确性,通过状态集不被其他线程修改。

可见性:自身的执行对状态的修改可能影响其他线程的约束。修改——可见存在延迟,可见性去除了其中的延迟。

提供可见性的状态维护了这组状态的一致快照

 

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 共享对象

标签:vector   atom   静态   存在   基本   容器类   cto   locking   hashtable   

原文地址:https://www.cnblogs.com/qmc2077/p/11625697.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!