Disruptor 緩沖行填充的進(jìn)一步解釋

最近學(xué)習(xí)Disruptor的使用。也看了不少介紹緩沖行的原理,比如這篇。其中關(guān)于緩沖行的實(shí)現(xiàn),一直不太明白。為什么是15個(gè)long?不是更多或更少? 對(duì)于明白的同學(xué)可能很簡單。對(duì)于我來說可能少了一些中間的說明。這兩天突然開竅了,所以把它記錄下來。先看代碼: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個(gè)字節(jié)。目前主流的緩沖行大小一般是64字節(jié),也就是可以存放8個(gè)long。
  2. 緩沖行填充被設(shè)計(jì)成前面7個(gè)long, 后面7個(gè)long是為了保證有效數(shù)據(jù)和padding被任意分割的情況下都可以實(shí)現(xiàn)和其他無關(guān)數(shù)據(jù)不共享,從而避免相互影響(偽共享:因?yàn)闊o關(guān)數(shù)據(jù)變更而導(dǎo)致有效數(shù)據(jù)被清理出緩存,或者相反),見下圖
  • V=Value=有效值
  • P=Padding=填充
  • U=Unstable=不穩(wěn)定無關(guān)數(shù)據(jù)
緩沖行填充.png
  1. 當(dāng)然有效值不一定是long,也不一定是一個(gè),可以推廣到多個(gè)連續(xù)數(shù)據(jù),例如com.lmax.disruptor.RingBuffer 中就有多個(gè)連續(xù)有效值
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;
    ...
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容