5

我正在研究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
{
....
4

1 回答 1

8

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

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

于 2015-08-12T13:38:48.767 回答