Disruptor - Ring Buffer

Hum*_*mad 4 java circular-buffer data-structures disruptor-pattern

我正在调查LMAX Disruptor的源代码,我进入了RingBuffer抽象类.为什么正好有7个长场(p1 ... p7)RingBufferPad?这是实际代码:https: //github.com/LMAX-Exchange/disruptor/blob/master/src/main/java/com/lmax/disruptor/RingBuffer.java

abstract class RingBufferPad
{
    protected long p1, p2, p3, p4, p5, p6, p7;
}

abstract class RingBufferFields<E> extends RingBufferPad
{
....
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 6

这是为了确保long实际使用的值在它自己的缓存行上.这样可以避免错误共享,其中有两个long需要由竞争相同缓存行的不同线程更新.

这里假设CPU高速缓存行长度为64字节(并且它在大多数体系结构上,例如ARM,AMD和Intel CPU).使用7 longs有点偏执,因为标题将是8字节最小值,最大16字节(具有分配对齐),因此6或甚至5个long值就足够了.

  • 没有想到错误共享,实际上LMAX的白皮书提到了有关缓存线的内容,看到您的回答后我记住了它,但似乎我没有认真对待它,无论如何谢谢您引导我到正确的地方 (2认同)
  • 我发现 Martin Thompson(机械同情)关于虚假共享的非常有用的帖子 http://mechanical-sympathy.blogspot.kr/2011/07/false-sharing.html (2认同)