Ответ
Монитор есть у каждого объекта в 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.