Disruptor - 环形缓冲区
Disruptor - Ring Buffer
我正在研究 LMAX Disruptor 的 源代码,我进入了 RingBuffer
摘要 class。为什么 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
{
....
这是为了确保实际使用的 long
值在它自己的缓存行上。这避免了 false sharing 你有两个需要由竞争同一缓存行的不同线程更新的 long。
这里的假设是 CPU 缓存行长度为 64 字节(并且在大多数架构上都是如此,例如 ARM、AMD 和 Intel CPUs)。使用 7 long
s 有点偏执,因为 header 最小为 8 个字节,最大为 16 个字节(分配对齐),所以 6 个甚至 5 个 long
值就足够了。
我正在研究 LMAX Disruptor 的 源代码,我进入了 RingBuffer
摘要 class。为什么 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
{
....
这是为了确保实际使用的 long
值在它自己的缓存行上。这避免了 false sharing 你有两个需要由竞争同一缓存行的不同线程更新的 long。
这里的假设是 CPU 缓存行长度为 64 字节(并且在大多数架构上都是如此,例如 ARM、AMD 和 Intel CPUs)。使用 7 long
s 有点偏执,因为 header 最小为 8 个字节,最大为 16 个字节(分配对齐),所以 6 个甚至 5 个 long
值就足够了。