volatile原理

volatile的原理和实现机制(内存屏障)

volatile到底如何保证可见性和禁止指令重排序的:

下面这段话摘自《深入理解Java虚拟机》:

“观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令”

lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:

1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;

2)它会强制将对缓存的修改操作立即写入主存;

3)如果是写操作,它会导致其他CPU中对应的缓存行无效。

总结

1:volatile保证重排序。它确保指令重排序时不会把其后面的指令排到lock标记指令之前的位置,也不会把前面的指令排到其后面;即在执行到带lock前缀的这句指令时,在它前面的操作已经全部完成。
2:volatile保证可见性。它会强制将对缓存的修改操作立即写入主存,同时会将其他线程缓存行中内容标记为无效状态,因此其他线程操作变量时,必须重新从主内存中读取变量的值。
3:volatile线程不安全,因为无法保证原子性。

内存屏障请参考:https://www.jianshu.com/p/43af2cc32f90
———————————————————————————————————

你可能感兴趣的:(并发)