Что такое захват монитора (monitor) в Java?

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

Ответ

Захват монитора — это получение потоком эксклюзивной блокировки, связанной с конкретным объектом. Это основа работы ключевого слова synchronized.

  • Как работает: Каждый объект в Java имеет связанный с ним монитор (внутреннюю блокировку). Когда поток входит в synchronized блок (или метод), он захватывает монитор указанного объекта. Другие потоки, пытающиеся захватить монитор того же объекта, будут переведены в состояние BLOCKED до его освобождения.
  • Почему это важно: Гарантирует взаимное исключение (mutual exclusion) для критической секции кода, предотвращая состояние гонки (race condition).
  • Пример:

    public class Counter {
    private int value = 0;
    private final Object lock = new Object(); // Объект-монитор
    
    public void safeIncrement() {
        synchronized (lock) { // Поток захватывает монитор объекта 'lock'
            value++; // Критическая секция защищена
        } // При выходе из блока монитор автоматически освобождается
    }
    }
  • Ключевые моменты:
    • Монитор освобождается при нормальном или исключительном выходе из synchronized блока.
    • Методы wait(), notify(), notifyAll() класса Object могут быть вызваны только из synchronized контекста, так как требуют владения монитором.
    • Неправильное вложение блокировок может привести к взаимной блокировке (deadlock).