Disruptor 缓冲行填充的进一步解释

最近学习Disruptor的使用。也看了不少介绍缓冲行的原理,比如这篇。其中关于缓冲行的实现,一直不太明白。为什么是15个long?不是更多或更少? 对于明白的同学可能很简单。对于我来说可能少了一些中间的说明。这两天突然开窍了,所以把它记录下来。先看代码:com.lmax.disruptor.Sequence
class LhsPadding
{
    protected long p1, p2, p3, p4, p5, p6, p7;
}

class Value extends LhsPadding
{
    protected volatile long value;
}

class RhsPadding extends Value
{
    protected long p9, p10, p11, p12, p13, p14, p15;
}
public class Sequence extends RhsPadding
{
...
}
  1. java的lang类型占用8个字节。目前主流的缓冲行大小一般是64字节,也就是可以存放8个long。
  2. 缓冲行填充被设计成前面7个long, 后面7个long是为了保证有效数据和padding被任意分割的情况下都可以实现和其他无关数据不共享,从而避免相互影响(伪共享:因为无关数据变更而导致有效数据被清理出缓存,或者相反),见下图
  • V=Value=有效值
  • P=Padding=填充
  • U=Unstable=不稳定无关数据
缓冲行填充.png
  1. 当然有效值不一定是long,也不一定是一个,可以推广到多个连续数据,例如com.lmax.disruptor.RingBuffer 中就有多个连续有效值
abstract class RingBufferPad
{
    protected long p1, p2, p3, p4, p5, p6, p7;
}

abstract class RingBufferFields<E> extends RingBufferPad
{
    private final long indexMask;
    private final Object[] entries;
    protected final int bufferSize;
    protected final Sequencer sequencer;
    ...
}

public final class RingBuffer<E> extends RingBufferFields<E>{
    protected long p1, p2, p3, p4, p5, p6, p7;
    ...
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容