volatile如何实现内存可见
volatile
关键字是Java虚拟机
提供的最轻量级的同步机制,作为一个修饰符出现,用来修饰变量
volatile
如何保证可见性
- 内存变化:
- 无
volatile
时:
当sign
没有volatile
修饰时,线程01对变量进行操作,线程02并不会拿到变化的值 - 有
volatile
时:
当sign
有volatile
修饰时,线程01对变量进行操作时,会把变量变化的值强制刷新到主内存,线程02获取值时,会把自己内存中的sign
值设为过期,从主内存中读取
- 无
反编译解读可见性
- 编译后的汇编指令中,有
volatile
和没有volatile
的主要差别在于多了一个lock addl $0x0,(%rsp)
,也就是lock的前缀指令,lock指令相当于一个内存屏障,主要保障三点:- 将本处理器的缓存写入内存
- 重排序时不能把后面的指令重排序到内存屏障之前的位置
- 如果是写入动作会导致其他处理器中对应的内存无效
主要通过1、3保证被修饰变量的内存可见性
不加 volatile
也可见吗
- 在没
volatile
修饰时,JVM也会尽量保证可见性,在有volatile
修饰时,一定保证可见性