内存屏障就是一种屏障指令,在X86架构中,指的是加了“lock前缀”的汇编指令在执行时会让 CPU 或编译器在对内存进行操作的时候, 严格按照一定的顺序来执行。
也就是说内存屏障保证了一下两点:第一点是 在内存屏障之前的指令和之后的指令不会由于CPU的指令优化而导致指令乱序执行;第二点是 在内存屏障之前的指令不会由于编译器指令重排序优化而导致指令分发到在多个核心或者多个处理器去乱序执行。
而Java的volatile关键字也和内存屏障有关系。
Java的volatile关键字有两个功能,其中的禁止指令重排序优化这个功能,实质是在生成的汇编指令cmpxchg之前加了lock前缀。(cmpxchg是x86架构下的比较并交换操作的实现,虽然在CPU层面cmpxchg是一个指令,但是在执行时会翻译成几条微码执行读操作和写操作,而lock前缀也是x86架构下才有的,目的就是为了保证指令的原子执行)
加了lock前缀的指令在CPU执行时就相当于形成了内存屏障。
Lock前缀可以锁定缓存行并把CPU store缓冲区中的所有数据刷新到内存中(这里的刷到内存中,不是CPU的主动写入,而是触发缓存一致性协议,由缓存子系统来回写内存或者通过QPI总线同步其他cache中的副本,并且缓存一致性协议自动阻止缓存了相同内存区域的两个或多个处理器同时修改该区域中的数据)。所以这意味着所有之前的指令都已经执行完成,这样就形成了“禁止指令重排序”的效果。
标签:缓存,Java,屏障,指令,volatile,内存,CPU,前缀 From: https://www.cnblogs.com/bryantor/p/16853049.html