Disruptor - кольцевой буфер

Я исследую исходный код LMAX Disruptor, и я пришел в RingBuffer абстрактный класс. Почему именно 7 длинных полей (p1 ... p7) в RingBufferPad? Вот актуальный код: 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
{
....

1 ответ

Решение

Это должно обеспечить long значение, которое фактически используется, находится на его собственной строке кэша. Это позволит избежать ложного обмена, когда у вас есть два long, которые должны обновляться разными потоками, конкурирующими за одну и ту же строку кэша.

Здесь предполагается, что длина строки кэша ЦП составляет 64 байта (и это на большинстве архитектур, например, ARM, AMD и Intel). Используя 7 longs немного параноидален, так как заголовок будет иметь длину не менее 8 байтов, максимум 16 байтов (с выравниванием распределения), поэтому 6 или даже 5 long значения будет достаточно.

Другие вопросы по тегам