volatile怎么保证可见性和有序性?
volatile
变量会在字段修饰符中显示ACC_VOLATILE
。通过插入内存屏障指令,禁止指令重排序。不管前面与后面任何指令,都不能与内存屏障指令进行重排,保证前后的指令按顺序执行 。同时保证数据修改的可见性。
- 在每个volatile写操作的前面插入一个
StoreStore
屏障,后面插入一个StoreLoad
屏障。 - 在每个volatile读操作的后面插入一个
LoadLoad
、LoadStore
屏障。
内存屏障和MESI的关系,MESI可以通过串行化保证缓存一致性,但效率太低。因此对缓存失效逻辑进行了优化,但会导致指令重排序、数据不可见问题。最终通过内存屏障解决了指令重排序和数据不可见问题。