Happens Before в Java

В Java отношение happens before используется для определения порядка действий в многопоточной программе. Отношение happens before гарантирует, что изменения, внесенные одним потоком, будут видны другому потоку предсказуемым и последовательным образом.


Правила happens before в Java следующие:

  • Действие в потоке, которое происходит до другого действия в том же потоке, происходит до второго действия.
  • Действие, которое инициализирует переменную, происходит до любого последующего чтения или записи этой переменной.
  • Вызов start() в потоке происходит перед любыми действиями в запущенном потоке.
  • Вызов join() в потоке происходит после завершения всех действий в потоке.
  • Вызов notify() или notifyAll() для объекта происходит до последующего вызова wait() для того же объекта.

Отношения happens before помогают гарантировать, что изменения, внесенные одним потоком, будут видны другому потоку предсказуемым и последовательным образом. Это помогает предотвратить состояния гонки и другие проблемы синхронизации, которые могут возникнуть в многопоточных программах.


Пример работы happens before:

class MyThread extends Thread {
    private int value;

    public void run() {
        value = 42;
    }

    public int getValue() {
        return value;
    }
}

MyThread t = new MyThread();
t.start();
t.join();
System.out.println(t.getValue());

В этом примере вызов join() объекта MyThread гарантирует, что все действия в потоке будут завершены до вызова метода getValue(). Это устанавливает связь «происходит перед» между записью в переменную значения в объекте MyThread и чтением этой переменной в основном потоке, гарантируя, что основной поток увидит правильное значение 42.