Ответ
Монитором является сам объект, у которого вызываются методы 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-блока по тому же объекту, будит один или все ожидающие потоки соответственно.