Disruptor - 环形缓冲区

Disruptor - Ring Buffer

我正在研究 LMAX Disruptor 的 源代码,我进入了 RingBuffer 摘要 class。为什么 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
{
....

这是为了确保实际使用的 long 值在它自己的缓存行上。这避免了 false sharing 你有两个需要由竞争同一缓存行的不同线程更新的 long。

这里的假设是 CPU 缓存行长度为 64 字节(并且在大多数架构上都是如此,例如 ARM、AMD 和 Intel CPUs)。使用 7 longs 有点偏执,因为 header 最小为 8 个字节,最大为 16 个字节(分配对齐),所以 6 个甚至 5 个 long 值就足够了。