Volatile是java虚拟机提供的轻量级的同步机制
同步机制的三大特性:保证可见性、不保证原子性、禁止指令重排
JMM:Java Memory Model,是一种抽象的概念并不真实存在,是一种规则或是规范,定义了程序中的各个变量的访问方式。
关于同步的规定:
线程解锁前,必须把共享变量的值刷新回主内存
线程加锁前,必须读取主内存的最新值回到自己的工作内存
加锁解锁是同一把锁
JMM的特性:
可见性、原子性、有序性
可见性:各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存进行操作后再写到主内存中,存在着一个线程A修改了共享变量中的值,当数据还未回写到主内存时,另一个线程B又对主内存中的同一个变量进行操作,但此时的A线程工作内存中的共享变量对线程B并不可见,这种工作内存与主内存同步延迟现象就造成了可见性问题。
所谓可见性,即缺乏可见性。
有序性:计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令重排。
源编码->编译器优化的重排->指令并行的重排->内存系统的重排->最终执行的指令
处理器在进行重排序时必须要考虑指令之间的数据依赖性
多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测。
Volatile实现禁止指令重排的优化
内存屏障又称内存栅栏,是一个CPU指令,两个作用。
一 保证特定操作的执行顺序
二 保证某些变量的内存可见性