https://www.bilibili.com/video/BV1pe4y1x7Ea
《深入理解JAVA 虚拟机》中有如下描述:
“观察加入 volatile 关键字和没有加入 volatile 关键字时所生成的汇编代码发现,加入 volatile 关键字时,会多出一个 lock 前缀指令”
lock 前缀指令实际上相当于一个内存屏障(也叫内存栅栏),内存屏障会提供3个功能:
所以可见性和禁止指令重排序如下:
可见性:
volatile 的功能就是被修改的变量在被修改后可以立即同步到主内存,被修饰的变量在每次使用之前都从主内存刷新。本质也是通过内存屏障来实现可见性
写内存屏障(Store Memory Barrier)可以促进处理器将当前 store buffer(存储缓存)的值写回主存。读内存屏障(Load Memory Barrier)可以促使处理器处理 invalidate queue(失效队列)。进而避免由于 Store Buffer 和 Invalidate Queue 的非实时性带来的问题。
禁止指令重排序:
volatile 是通过内存屏障来禁止指令重排序
JMM 内存屏障的策略