之前读了一篇美团点评技术博客 2016 年发表的文章:高性能队列——Disruptor,里面提到了 ArrayBlockingQueue
会因为加锁和伪共享等出现严重的性能问题。
什么是伪共享呢(False Sharing)
呢,讲清楚伪共享出现的原因,我们要先理清楚高速缓存和MESI
缓存一致性协议。
Cache Memory
我们都知道 CPU
和主内存之间的运算速度是差异巨大的,在现今的 SMP(Symmetric Multiprocessor)System
中,会在 CPU 和主存间设置三级高速缓存,L1
、L2
和 L3
,读取顺序由先到后。实际上 Cache
的设计是经历过变更的,Intel
和 AMD
的实现细节都不尽相同,本文你可以简单理解为,L1 Cache
分为指令缓存和数据缓存两种,L2 Cache
只存储数据,L1
和 L2
都是每个核心都有,而 L3
被多核共享。
MESI
那么问题来了,多核CPU
的情况下有多个 L1 和 L2 缓存,如何保证缓存内部数据的一