Hardjmmhappens-before

Что такое happens-before в Java Memory Model?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

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

class Config {
    private int data;
    private volatile boolean ready = false;  // volatile rule

    void writer() {                  // поток 1
        data = 42;                   // (1)
        ready = true;                // (2) hb последующее чтение ready
    }
    void reader() {                  // поток 2
        if (ready) { assert data == 42; }  // видит (1) через hb
    }
}

Способы установить happens-before:

  • Program order — внутри одного потока;
  • Monitor lock rule — unlock hb следующий lock того же monitor;
  • Volatile rule — запись hb последующее чтение того же volatile;
  • Thread startThread.start() hb действия в новом потоке;
  • Thread termination — действия hb завершение через join();
  • Final field rule — запись final field в конструкторе hb чтению ссылки (safe publication);
  • Transitivity — A hb B, B hb C → A hb C.

Без happens-before — data race, результат undefined.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.