Что такое happens-before в Java

«Что такое happens-before в Java» — вопрос из категории Многопоточность, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Happens-before — это отношение между операциями в многопоточной среде, гарантирующее видимость изменений между потоками. Если операция A happens-before B, то результат A виден для B.

Основные правила:

  • Программный порядок: действия в потоке упорядочены согласно коду.
  • Монитор (synchronized): освобождение монитора happens-before следующее захватывание того же монитора.
  • volatile: запись в volatile переменную happens-before чтение той же переменной.
  • start() потока: вызов start() happens-before любые действия в новом потоке.
  • join(): завершение потока happens-before успешный возврат из join().

Пример:

// Поток 1
synchronized(lock) {
    x = 42; // (1)
    flag = true; // volatile
}
// Поток 2
if (flag) { // volatile read
    synchronized(lock) {
        System.out.println(x); // гарантированно увидит 42
    }
}