• 伪共享与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      写得超级好

  • 相关阅读:
    白话经典算法系列之六 高速排序 高速搞定
    簡單SQL存儲過程實例
    ACE编译运行错误解决
    shell之变量与read
    Java实现第八届蓝桥杯魔方状态
    Java实现第八届蓝桥杯魔方状态
    Java实现第八届蓝桥杯魔方状态
    Java实现第八届蓝桥杯魔方状态
    Java实现第八届蓝桥杯购物单
    Java实现第八届蓝桥杯购物单
  • 原文地址:https://www.cnblogs.com/yangcao/p/11706909.html
Copyright © 2020-2023  润新知