Volatile
volatile 作用
- 禁止指令重排
- 可见性
JVM层面实现
jvm实现volatile是使用指令屏障实现的
汇编层面实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-opiQdYpm-1602603909947)(图片/Volatile/image-20201009233018270.png)]
汇编使用lock指令实现+MESI缓存一致性协议实现的
Lock指令相当于一条内存屏障,指令重排时,不能把后面的指令重排到内存屏障之前的位置.
以前的CPU lock都是用于锁定总线实现的,但是这样效率太低了
现在的CPU 使用锁缓存来代替锁总线
多处理器、多线程环境下,若某个线程对声明了volatile的变量进行写操作,JVM会向处理器发送一条LOCK前缀的指令,将这个变量所在缓存行的数据写回主内存,LOCK前缀指令通过 “锁缓存” 可以确保回写主内存的操作是原子性的。
但是&#