Hardjmmconcurrency

Что такое Java Memory Model (JMM)?

1Постановка

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

2Решение

Java Memory Model (JSR 133, Java 5+) — спецификация взаимодействия потоков через memory: гарантирует видимость изменений и упорядочивание операций. Без JMM поведение было undefined (компилятор и CPU переупорядочивают инструкции).

class Flag {
    private volatile boolean ready = false; // volatile — видимость + memory barrier
    private int data;

    void writer() {      // поток 1
        data = 42;       // (1)
        ready = true;    // (2) volatile-запись
    }
    void reader() {      // поток 2
        if (ready) {     // (3) volatile-чтение: видны все записи до (2)
            assert data == 42;  // guaranteed
        }
    }
}

Ключевые понятия:

  • happens-before — если A happens-before B, эффекты A видны B (через synchronized, volatile, final, Thread.start, Thread.join);
  • volatile гарантирует видимость, но не атомарность составных операций;
  • data race — два потока обращаются к non-final полю, хотя бы один пишет, без happens-before → undefined.

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

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

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