Вопрос проверяет понимание формальных гарантий видимости и порядка операций в многопоточной среде Java.
happens-before — это отношение порядка между операциями в Java Memory Model.
Если одна операция happens-before другой, то её результаты гарантированно видны.
Это не обязательно реальный порядок выполнения.
Отношение используется JVM для определения корректности многопоточных программ.
Без него невозможно формально рассуждать о потокобезопасности.
Для корректной многопоточной программы важно не только что выполняется, но и какие гарантии видимости существуют между потоками.
happens-beforeОпределение:
Отношение happens-before означает, что все эффекты первой операции становятся видимыми для второй операции.
Если:
A happens-before B
то:
все записи A видны в B
Важно не путать:
Это не реальное время выполнения.
Это не означает, что A выполнится раньше B в CPU.
Это логическая гарантия видимости и порядка.
Отношение happens-before позволяет:
Формально описывать корректность кода.
Доказывать потокобезопасность.
Понимать поведение volatile, synchronized, final.
int x = 0;
boolean ready = false;
// поток 1
x = 42;
ready = true;
// поток 2
if (ready) {
System.out.println(x); // может быть 0
}
Без happens-before JVM не обязана показывать x = 42.
happens-before — это фундаментальное понятие JMM, определяющее, какие изменения памяти гарантированно видны между потоками.