Что является монитором при вызове методов wait() и notify() в Java?

«Что является монитором при вызове методов wait() и notify() в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевые правила:

  • Поток должен владеть монитором объекта (находиться внутри synchronized-блока для этого объекта) перед вызовом wait(), notify() или notifyAll().
  • Вызов этих методов без захваченного монитора приводит к IllegalMonitorStateException.
  • Метод wait() временно освобождает монитор, позволяя другим потокам его захватить, и переводит текущий поток в состояние ожидания.

Пример использования:

final Object lock = new Object();

synchronized (lock) { // Захват монитора объекта 'lock'
    while (!conditionMet) {
        lock.wait(); // Освобождает монитор и ожидает
    }
    // После пробуждения поток автоматически перезахватывает монитор
    // и может выполнять работу под защитой синхронизации
}

Метод notify() или notifyAll(), вызванный другим потоком из synchronized-блока по тому же объекту, будит один или все ожидающие потоки соответственно.