volatile 关键字是用来修饰变量
具备两层含义:
- 保证线程间的可见性
- 禁止指令重排序
保证线程间的可见性
用volatile修饰的共享变量,能够防止编译器等优化发生,让一个线程对共享变量的修改对另一个线程可见
禁止编译器优化,可以使用VM 参数 -Xint
禁止指令重排序
用volatile修饰共享变量会在读、写共享变量时加入不同的屏障,阻止其他读写操作越过屏障,从而达到阻止重排序的效果。
jcstress 多线程测试工具
在变量上添加volatile,禁止指令重排序,则可以解决问题
写操作加的屏障阻止上方其它写操作越过屏障到volatile变量之下
读操作的屏障是阻止下方其它读操作越过屏障排到volatile变量读之上
volatile使用技巧
- 写变量让volatile修饰的变量在代码最后位置
- 读变量让volatile修饰的变量在代码最开始位置
谈谈volatile的理解
- 保证线程间的可见性:用volatile修饰的共享变量,能够防止编译器优化发生,让一个线程对共享变量的修改,对另一个线程可见
- 禁止进行指令重排序:用volatile修饰共享变量会在读写共享变量时加入不同的屏障,阻止其他读写操作越过屏障,从而达到阻止重排序的效果