我们都知道CPU有三级缓存,L1,L2,为核心独享,L3为CPU共享,而当前主流的CPU还都支持Store Buffer 和invalid queue,在这种情况下MESI是无法生效的,而在一些指令重排的情况下,核心读到的值可能不是最新的,这时就需要通过指令重排来进行同步,指令重排不止具备禁止重排序的特性,还具备同步刷新的特性
storebuffer和invalidate queue的设计是为了加速CPU的内存访问而设计的,但是在某些指令重排的情况下,可能会导致数据不一致的问题,所以新增了内存屏障的指令,也就是说内存屏障是为storebuffer和invalidatequeue 而设计的,目的是解决指令重排序情况下的不一致问题
volatile是JVM的内存语义,这里借用知乎中的一个回答:
volatile是java语言层面给出的保证,MSEI协议是多核cpu保证cache一致性的一种方法,中间隔的还很远,我们可以先来做几个假设:
- 回到远古时候,那个时候cpu只有单核,或者是多核但是保证sequence consistency,当然也无所谓有没有MESI协议了。那这个时候,我们需要java语言层面的volatile的支持吗?
当然是需要的,因为在语言层面编译器和虚拟机为了做性能优化,可能会存在 指令重排的可能,而volatile给我们提供了一种能力,我们可以告诉编译器,什么可以重排,什么不可以。
- 那好,假设更进一步&#