线程安全要考虑三个方面:可见性、有序性、原子性
volatile只能保证共享变量的可见性和有序性,但是不能保证原子性;(volatile一般修饰变量)
可见性
起因:由于编译器优化(JIT)、或缓存优化、或 CPU 指令重排序优化导致的对共享变量所做的修改另外的线程看不到
解决:用 volatile 修饰共享变量,能够防止编译器等优化发生,让一个线程对共享变量的修改对另一个线程可见
可见性产生的原因错误理解:
正确理解:
volatile 变量写加的屏障是阻止上方其它写操作越过屏障排到 volatile 变量写之下
volatile 变量读加的屏障是阻止下方其它读操作越过屏障排到
volatile 变量读之上volatile 读写加入的屏障只能防止同一线程内的指令重排