为了实现volatile的特性(内存语义):JMM会限制以下重排序,volatile 通过以下规则保证有序性
第一个操作是volatile读时,不管第二操作是什么,都不能重排序,确保 volatile 读之后的操作不会被编译器重排序到 volatile 读之前
第二个操作是volatile写时,不管第一操作是什么,都不能重排序,确保 volatile 写之前的操作不会被编译器重排序到 volatile 写之后
当第一个操作是volatile写,第二个操作是volatile读时,不能重排序。
一读二写
编译器在生成字节码时,会在指令序列中插入内存屏障
在volatile读操作的后面插入③LoadLoad、④LoadStore屏障(1)
在volatile写操作的①前、②后插入StoreStore、StoreLoad屏障(2、3)
为什么少了普通读-volatile写禁止重排序?(volatile写前LoadStore屏障)因为一个是普通变量读,一个是volatile的读\写,两个变量之间没有happens-before规则
编译时对有volatile关键字的变量,在汇编代码中加入lock前缀指令(lock addl)锁住缓存行,引起处理器CPU缓存行的数据写回主内存并导致其他处理器的缓存失效(处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期)。当处理器发现本地缓存失效后,就会从内存中重读该变量数据,即可以获取当前最新值(一次读取64字节缓存行)相当于一个内存屏障(一组处理指令),用来实现对内存操作的顺序限制。内存屏障使用sfence mfence lfence等系统原语或者锁总线实现

被折叠的 条评论
为什么被折叠?



