描述
volatile是java虚拟机提供的一种轻量级同步机制
特征
- 保证可见性
- 禁重排序
- 不保证原子性,即不保证并发中的安全性
如何保证可见性
回忆java内存模型的基本知识
java执行的时候分为主内存和工作内存
线程执行的时候读取的是工作内存中的数据
工作内存中的数据是由主内存中读取的
模型图
执行流程描述
线程1创建的时候从主内存(共享)中拉取data=0数据副本存放到工作内存中,线程2创建和线程1一致。当前大家可以看到线程1和线程2都将data = 0 这个数据拉取到各自的运行内存中
目前遇到一种情况,线程1把data数据更新为1,如图
而线程2中data=0,这就导致了并发编程中的可见性问题,即线程1和线程2虽操作同一个对象data,但对对方的修改是看不到的,看到的一直都是运行内存中的data副本的值。
volatile是如何保证可见性的
代码中使用
/**
* The synchronization state.
*/
private volatile int state;
作用流程
1.线程1中修改data=1,立即强制刷新回主内存中
2.强制过期其他工作线程中data的缓存
3.其他工作线程再次读取data则会从主内存中读取