最近學(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
{
...
}
- java的lang類型占用8個(gè)字節(jié)。目前主流的緩沖行大小一般是64字節(jié),也就是可以存放8個(gè)long。
- 緩沖行填充被設(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
- 當(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;
...
}