Ответ
Отношение happens-before — это гарантия модели памяти Java, которая обеспечивает видимость изменений памяти между потоками и упорядочивание операций. Если операция A happens-before операция B, то все изменения памяти, сделанные в A, будут видны потоку, выполняющему B.
Основные правила и механизмы:
-
Правило монитора (связь с
synchronized): Освобождение монитора (выход изsynchronized-блока) happens-before последующее захват того же монитора.// Поток 1 synchronized (lock) { sharedFlag = true; // (1) } // Освобождение lock -> happens-before // Поток 2 synchronized (lock) { // Захват того же lock if (sharedFlag) { // Гарантированно увидит true из (1) // ... } } -
Правило
volatile: Запись вvolatile-переменную happens-before каждое последующее чтение той же переменной.volatile boolean initialized = false; // Поток 1 config = loadConfig(); // (2) initialized = true; // Запись в volatile // Поток 2 if (initialized) { // Чтение volatile // Гарантированно увидит config, инициализированный в (2) use(config); } -
Правило
Thread.start(): Вызовthread.start()happens-before начало выполнения любого кода в новом потоке. -
Правило
Thread.join(): Все действия в потоке happen-before успешный возврат изjoin()для этого потока в другом потоке. -
Классы
java.util.concurrent: Такие инструменты, какCountDownLatch.await(),CyclicBarrier.await(), получение результата изFuture.get(), также устанавливают отношение happens-before.