Что проверяет вопрос «объясните happens-before»

Этот вопрос проверяет, понимает ли кандидат модель памяти Java, а не просто помнит слово synchronized. happens-before — гарантия порядка действий между потоками, а не гарантия реального времени выполнения.

Если запись A happens-before чтения B, поток, увидевший B, гарантированно видит A и всё, что было до A по программному порядку. Отношение возникает из конкретных источников: запись в volatile-переменную happens-before последующего чтения той же переменной; выход из synchronized-блока happens-before входа в блок с тем же монитором; Thread.start() happens-before любого действия в запущенном потоке; последнее действие потока happens-before Thread.join() в том, кто его ждёт.

Без одного из этих отношений компилятор, JIT и процессор имеют право переставить операции местами. На одном железе это может годами не проявляться и всплыть только после смены процессора или обновления JVM.

private volatile boolean ready = false; private int data;

// writer thread data = 42; ready = true;

// reader thread if (ready) { System.out.println(data); }

Ловушка: часто спрашивают — если убрать volatile у ready, может ли reader увидеть ready == true, но data == 0. Ответ: да, реордеринг разрешён JMM, даже если на x86 на практике это редко воспроизводится.

happens-before не про то, что «быстрее» — это единственный контракт, на который можно ссылаться при написании многопоточного кода.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки