对象共享
synchronized 设定原子性确定临界区 + 内存可见性
要解决如下问题
防止一个线程在使用对象状态而另一个线程在修改对象状态;且当一个线程修改了对象状态后,对其他线程可见。
 
可见性
多线程情况下的读写,无法保证在执行读操作时能够看到其他线程写入的值 --- 同步机制解决
造成可见性的原因之一:指令重排序 ---- 产生失效数据
 
在32为机器执行double和long的问题
Jvm会拆分为两个32为的操作,在读取或写入时可能存在问题
读取到某个数的的高32位和另一个数的低32位     ---- (volatile)
 
加锁和可见性
加锁不仅是局限于互斥行为,还包括内存可见性。所有执行读写操作的线程都必须在同一个锁上同步。(happen-before)
 
volatile
保证变量更新通知其他线程,volatile变量确定为共享变量,不会进行指令重排序。而且不会被寄存器缓存。
volatile可见性,A线程写入一个volatile变量,B线程读取该变量。在写入之前对A可见的所有变量的值,在B读取变量以后对B也可见。
使用情况:在需要对可见性进行复杂判断时,不适用;适用于:自身状态可见性,确保引用状态的可见性,标识一些重要的程序生命周期事件的发生(init/destroy)
volatile不能保证递增操作的原子性。
加锁操作即可保证原子性又能保证可见性,volatile只能保证可见性
 
volatile使用总结
对变量的写入操作不依赖于变量当前值,或者确保单线程更新变量
该变量不会与其他状态变量一起纳入不变性条件中
(不变性条件:
对象创建以后其状态就不能修改
对象的所有域都是final类型
对象是正确创建的(在对象的创建期间,this引用没有溢出)
)
在访问变量时不需要加锁
 
发布与逸出
发布:对象能在当前作用域以外的地方使用
逸出:对象在不该被发布时发布了(如对象构建完成前)
不要在构造其中使用this引用逸出。
 
线程封闭
不使用共享数据 --- 线程封闭
单线程内访问数据
当某个对象封闭在一个线程中时,将自动实现线程安全,即使被封闭的对象本身不是线程安全的
(JDBC -- Connection,局部变量,ThreadLoacal)
 
Ad-hoc线程封闭
维护线程封闭完全由程序承担。,访问volatile变量时如可以保证时单线程写入,则可以实现特殊的线程封闭,且volatile可保证可见性,其他线程可以看到最新值
 
栈封闭
局部变量
 
不变性
不可变对象一定线程安全
 
final域
构造不可变对象
保证对象初始化过程的安全性,共享final对象时无需同步。
如果final类型域指向的是可变的对象,在访问这些域所指向对象的状态时仍然需要同步
 
安全的发布模式
在静态初始化函数中初始化一个对象引用。
将对象引用保存在volatile类型的域或者AtomicReferance对象中
将对象引用保存到某个正确构造对象的final类型域中
将对象引用保存到一个由锁保护的域中
保证安全发布的容器
Vector / synchronizedList
Hashtable / synchronizedMap / ConcurrentMap
CopyOnWriteArrayList / CopyOnWriteArraySet / synchronizedSet
BlockingQueue / ConcurrentLinkedQueue
其他数据传输机制:Future / Exchanger
 
事实不可变对象
发布以后的状态不会再改变状态的对象
 
对象的发布需求取决于可变性:
不可变对象可以任意的发布
事实不可变对象需要安全的发布
可变对象需要安全的发布,并且线程安全必须用某个锁保护起来
 
并发程序中使用共享对象的常用策略
线程封闭 --- 对象只有一个线程持有
只读共享 --- 可变对象/不可变对象的多线程读取
线程安全共享 --- 在线程安全内部实现同步
保护对象 --- 加锁

最新文章

  1. 【转载】.NET模拟POST登录并保持登录状态
  2. sublime text下代码太长brackethighlighter不能正确显示闭合高亮的解决方法
  3. 快餐问题(dp好题)
  4. linux基础命令学习(七)samba服务器配置
  5. linux中的文件类型
  6. (转)使用 /proc 文件系统来访问 Linux 内核的内容
  7. Js获取Cookie值的方法
  8. 暑假集训(2)第三弹 ----- 食物链(poj1182)
  9. [MOC062066]背景建模资料收集整理
  10. SharePoint需要开启的网站集功能
  11. C --> OC with RunTime
  12. 调皮的QQ音乐API:修复无法获取歌单
  13. JavaScript面向对象编程(9)高速构建继承关系之整合原型链
  14. 韩顺平教学资源java、oracle、linux
  15. python自动化运维常用模块安装
  16. github常见操作和常见错误!错误提示:fatal: remote origin already exist
  17. ReactNative之从HelloWorld中看环境搭建、组件封装、Props及State
  18. SpringBoot1-创建SpringBoot项目
  19. python 给定数组任意组合等于一个定值的所有解
  20. eig()函数求特征值、特征向量、归一化

热门文章

  1. ETCD:etcd网关
  2. 用深度学习做命名实体识别(二):文本标注工具brat
  3. React 从入门到进阶之路(一)
  4. 史诗级最强教科书式“NIO与Netty编程”
  5. Thymeleaf常用语法:模板注释
  6. 微信小程序API交互反馈,wx.showToast显示消息提示框
  7. 高通电池管理基于qpnp-vm-bms电压模式
  8. github.com/pkg/errors库学习
  9. element-ui 中dialog居中
  10. 「MacOS」将网站转换为应用程序,只需一个Unite