Java 干扰环缓冲器

Java 干扰环缓冲器,java,data-structures,circular-buffer,disruptor-pattern,Java,Data Structures,Circular Buffer,Disruptor Pattern,我正在调查lmaxdisruptor的源代码,我进入了RingBuffer抽象类。为什么RingBufferPad中正好有7个长字段(p1…p7)? 以下是实际代码: 抽象类RingBufferPad { 保护长p1、p2、p3、p4、p5、p6、p7; } 抽象类RingBufferFields扩展了RingBufferPad { .... 这是为了确保实际使用的long值位于它自己的缓存线上。这避免了两个long值需要由不同线程为同一缓存线进行更新 这里的假设是CPU缓存线长度为64字节(

我正在调查lmaxdisruptor的源代码,我进入了
RingBuffer
抽象类。为什么
RingBufferPad
中正好有7个长字段(p1…p7)? 以下是实际代码:

抽象类RingBufferPad
{
保护长p1、p2、p3、p4、p5、p6、p7;
}
抽象类RingBufferFields扩展了RingBufferPad
{
....

这是为了确保实际使用的
long
值位于它自己的缓存线上。这避免了两个long值需要由不同线程为同一缓存线进行更新


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

这与错误共享有关请看:错误共享并没有出现在我的脑海中,实际上LMAX的白皮书提到了缓存线,在看到你的答案后,我记得它,但似乎我没有认真对待它,无论如何,感谢你指导我到正确的位置我发现了非常有用的帖子论马丁·汤普森的虚假分享(机械同情)环缓冲区类中实际使用了哪个
long
值,并且有可能被错误共享?据我所知,
Sequencer
是包含
long
的类,它有可能被错误共享。@shibumi如果创建两个环缓冲区,它们可以使用相同的缓存线而无需填充。@shibumi数组是对象,不是编码对象的一部分。理论上,它们可以位于内存中的任何其他位置。
abstract class RingBufferPad
{
    protected long p1, p2, p3, p4, p5, p6, p7;
}

abstract class RingBufferFields<E> extends RingBufferPad
{
....