【并发编程篇13】volatile

36 阅读1分钟

volatile 关键字是用来修饰变量

具备两层含义:

  • 保证线程间的可见性
  • 禁止指令重排序

保证线程间的可见性

用volatile修饰的共享变量,能够防止编译器等优化发生,让一个线程对共享变量的修改对另一个线程可见

禁止编译器优化,可以使用VM 参数 -Xint

image.png

禁止指令重排序

用volatile修饰共享变量会在读、写共享变量时加入不同的屏障,阻止其他读写操作越过屏障,从而达到阻止重排序的效果。

image.png

jcstress 多线程测试工具

image.png

image.png

image.png

在变量上添加volatile,禁止指令重排序,则可以解决问题

image.png

写操作加的屏障阻止上方其它写操作越过屏障到volatile变量之下

读操作的屏障是阻止下方其它读操作越过屏障排到volatile变量读之上

volatile使用技巧

  • 写变量让volatile修饰的变量在代码最后位置
  • 读变量让volatile修饰的变量在代码最开始位置

谈谈volatile的理解

  1. 保证线程间的可见性:用volatile修饰的共享变量,能够防止编译器优化发生,让一个线程对共享变量的修改,对另一个线程可见
  2. 禁止进行指令重排序:用volatile修饰共享变量会在读写共享变量时加入不同的屏障,阻止其他读写操作越过屏障,从而达到阻止重排序的效果