Ответ
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
}
}