在整个并发知识体系(不断扩充)下,本文主要讨论的内容:
volatile可以说是java虚拟机提供的最轻量级的同步机制,因为它不会引起线程上下文的调度和切换,执行成本比synchronized低。Java内存模型(JMM)告诉我们,各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存中的数据进行操作处理。线程在工作内存进行操作后何时会写到主内存中?这个时机对普通变量是没有规定的,而针对volatile修饰的变量给java虚拟机特殊的约定,线程对volatile变量的修改会立刻被其他线程所感知,即不会出现数据脏读的现象,从而保证数据的“可见性”。
二、volatile实现原理- Lock前缀指令
- MESI协议
在此处要引入一个硬件知识,就是CPU Cache(高速缓存),计算机的存储层次为寄存器、cpu cache、内存、磁盘。cpu不会直接和内存进行交互,他们之间有一个cpu cache作为缓存,提高系统的运行速度。
一个volatile变量,在生成汇编代码时会在volatile修饰的共享变量进行写操作的时候会多出Lock前缀的指令
volatile实现原理:
- 1、Lock指令会引起处理器将缓存写回到内存
如果对声明了volatile的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存 - 2、使用EMSI或嗅探机制保证缓存一致性
但是写回到内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题。所以,在多处理器下,为了保证各个处理器的缓存是一致的,就需要缓存一致性协议:MESI、总线嗅探机制。不懂这两个名词的可以自行查阅,涉及到cpu cache缓存一致性知识,还可以拓展cache伪共享问题,cpu cache 存储结构,这里不再详细叙述。
上面的讲解其实也就是保证了volatile的可见性。
三、volatile内存语义 四、如何保证有序性 五、参考资料


