Disruptor - Ring Buffer

时间:2015-08-12 13:34:22

标签: java data-structures circular-buffer disruptor-pattern

我正在调查 LMAX Disruptor的源代码,我进入了RingBuffer抽象类。为什么RingBufferPad中只有7个长字段(p1 ... p7)? 这是实际代码: 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
{
....

1 个答案:

答案 0 :(得分:6)

这是为了确保实际使用的long值位于其自己的缓存行上。这避免了false sharing,其中有两个long需要由竞争相同缓存行的不同线程更新。

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