2015-08-12 8 views
2

Я изучаю Исходный код L12X Disruptor's, и я пришел в RingBuffer абстрактный класс. Почему существует ровно 7 длинных полей (p1 ... p7) в RingBufferPad? Вот фактический код: https://github.com/LMAX-Exchange/disruptor/blob/master/src/main/java/com/lmax/disruptor/RingBuffer.javaDisruptor - Ring Buffer

abstract class RingBufferPad 
{ 
    protected long p1, p2, p3, p4, p5, p6, p7; 
} 

abstract class RingBufferFields<E> extends RingBufferPad 
{ 
.... 
+0

Это связано с непреднамеренного совместного см: http://stackoverflow.com/a/28181831/950252 https://en.wikipedia.org/wiki/False_sharing – Justin

ответ

4

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

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

+1

Ложное разделение не приходит на ум, на самом деле белая бумага LMAX упоминала о линии кэша, увидев ваш ответ, я вспомнил об этом, но, похоже, я не воспринял это всерьез, так или иначе спасибо за то, что вы направили меня в нужное место. – Humoyun

+1

Я нашел очень полезное сообщение о False Sharing by Martin Thompson (Mechanical Сочувствие) http://mechanical-sympathy.blogspot.kr/2011/07/false-sharing.html – Humoyun