我正在调查 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
{
....
答案 0 :(得分:6)
这是为了确保实际使用的long
值位于其自己的缓存行上。这避免了false sharing,其中有两个long需要由竞争相同缓存行的不同线程更新。
这里的假设是CPU缓存行长度为64字节(并且它适用于大多数体系结构,例如ARM,AMD和Intel CPU)。使用7 long
s略显偏执,因为标题最小为8个字节,最大16个字节(具有分配对齐),因此6个甚至5个long
值就足够了。