伪共享与volatile

一、volatile

为了解决缓存不一致性问题,通常来说有以下2种解决方法:

  1)通过在总线加LOCK#锁的方式(通过在总线上加LOCK#锁的形式来解决缓存不一致的问题)

  2)通过缓存一致性协议(最出名的就是Intel 的MESI协)

这两种方法都是硬件层面的,在语言层面利用volatile以及加锁方式来保证 

        volatile的机制是保证可见性与禁止指令从排序,以就是当不同线程的不同缓存行存在内存中同一个变量的拷贝时,当一个缓存行中改值变量值改变时,用volatile修饰会使得改值立刻刷新到主存,从而第二个缓存行中该值失效,会再次从主存读取该值(类似于硬件层面的缓存一致性协议MESI)

二、伪共享

        伪共享是同一缓存行中两个变量问题(也就是多线程中的共享变量(比如disruptor中计数的线标atomic类就是封装成64字节来解决)),一个更新会导致另一个变量失效,从主存加载数据,导致速度很慢。

       如下图:如果一个 CPU 核心的线程在对 a 进行修改,另一个 CPU 核心的线程却在对 b 进行读取。

                    当前者修改 a 时,会把 a 和 b 同时加载到前者核心的缓存行中,更新完 a 后其它所有包含 a 的缓存行都将失效,因为其它缓存中的 a 不是最新值了。

                    而当后者读取 b 时,发现这个缓存行已经失效了,需要从主内存中重新加载。

                   请记住,我们的缓存都是以缓存行作为一个单位来处理的,所以失效 a 的缓存的同时,也会把 b 失效,反之亦然。

参考:https://www.jianshu.com/p/7758bb277985

          https://www.cnblogs.com/dolphin0520/p/3920373.html      写得超级好

原文地址:https://www.cnblogs.com/yangcao/p/11706909.html