Когда я прочитал mechnism «Ложное разделение» в Java, я нашел следующий код в java.util.concurrent.Exchanger.SlotПочему java's Exchanger.Slot кэширует строки так, как это?
/**
* A Slot is an AtomicReference with heuristic padding to lessen
* cache effects of this heavily CAS'ed location. While the
* padding adds noticeable space, all slots are created only on
* demand, and there will be more than one of them only when it
* would improve throughput more than enough to outweigh using
* extra space.
*/
private static final class Slot extends AtomicReference<Object> {
// Improve likelihood of isolation on <= 64 byte cache lines
long q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe;
}
Это strange.Why число долго 15 (q0 - qe), Таким образом, я могу рассчитать размер объекта:
15 * 8 (длинный) + 8 (длинное значение родителя) + (указатель заголовка объекта на 64 бит jvm) = 144 байт.
или:
15 * 8 (длинный) + 8 (длинное значение родителя) + (указатель заголовка объекта при 32 бит jvm) = 136 байт.
Как я в Disruptor's implemention: прочитанные
public long p1, p2, p3, p4, p5, p6, p7; // cache line padding
private volatile long cursor = INITIAL_CURSOR_VALUE;
public long p8, p9, p10, p11, p12, p13, p14; // cache line padding
размер должен быть 7 * 8 + 8 + 7 * 8 + 8 (объект головки opinter'size при 32 бита JVM) = 128 = 64 * 2.
As размер строки кеша по умолчанию для большинства процессоров составляет 64 байта, поэтому импликатор discruptor может избежать «Ложного обмена».
Так что мой вопрос - это количество заполненных длинными в классе java.util.concurrent.Exchanger.Slot верное или неправильное?