Hardjmmhappens-before
Что такое happens-before в Java Memory Model?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Happens-before — отношение между операциями, гарантирующее видимость. Если A happens-before B, то все записи перед A видны в B (нет reordering, эффекты published).
class Config {
private int data;
private volatile boolean ready = false; // volatile rule
void writer() { // поток 1
data = 42; // (1)
ready = true; // (2) hb последующее чтение ready
}
void reader() { // поток 2
if (ready) { assert data == 42; } // видит (1) через hb
}
}Способы установить happens-before:
- Program order — внутри одного потока;
- Monitor lock rule — unlock hb следующий lock того же monitor;
- Volatile rule — запись hb последующее чтение того же volatile;
- Thread start —
Thread.start()hb действия в новом потоке; - Thread termination — действия hb завершение через
join(); - Final field rule — запись final field в конструкторе hb чтению ссылки (safe publication);
- Transitivity — A hb B, B hb C → A hb C.
Без happens-before — data race, результат undefined.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.