У каких объектов в Java есть монитор?

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

Ответ

Монитор есть у каждого объекта в Java. Это встроенный механизм JVM, который используется для синхронизации потоков.

Как это работает:

  • Монитор — это внутренняя сущность, ассоциированная с каждым объектом.
  • Ключевое слово synchronized захватывает монитор указанного объекта.
  • Методы wait(), notify(), notifyAll() класса Object работают с этим монитором.

Практическое правило: Любой объект (экземпляр любого класса, включая массивы) может быть использован как монитор в synchronized блоке.

Пример:

public class Example {
    private final Object lockObject = new Object(); // У этого объекта есть монитор
    private int sharedData;

    public void safeMethod() {
        // Захватываем монитор объекта lockObject
        synchronized (lockObject) {
            sharedData++;
            lockObject.notify(); // Работаем с тем же монитором
        }
    }
}

Важно: Использование в качестве монитора специально созданного приватного объекта (private final Object lock = new Object()) предпочтительнее использования synchronized на самом классе (this) или других публичных объектах, чтобы избежать непреднамеренной блокировки и deadlock.