Когда генерируется IllegalMonitorSttateException?

Методы Object.wait(), Object.notify(), Object.notifyAll() генерируют исключение IllegalMonitorStateException. Это исключение выдается, если текущий поток не является владельцем монитора этого объекта. Но, не получая ясности относительно того, что без получения информации о погоде текущего объекта текущий поток сможет выполнить wait / notify / notifyAll для любого объекта? O/ W, каковы шансы для незаконного состояния монитора?

Спасибо Скоттб за предложение. Спасибо Хенно за ответ. Еще одно сомнение, которое я получаю, касается возможности стать владельцем монитора объекта:

Поток становится владельцем монитора объекта одним из следующих способов: • Выполняя синхронизированный метод экземпляра этого объекта. • Выполнение тела синхронизированного оператора, который синхронизируется на объекте. • Для объектов типа Class, путем выполнения синхронизированного статического метода этого класса.

Первые два утверждения понятны. Но что является фундаментальным с объектами типа class?

1 ответ

Как вы упоминаете, IllegalMonitorStateException генерируется, когда текущий поток не является владельцем монитора этого объекта, то есть монитора блокировки. Это означает, что текущий поток должен вызывать ожидание или уведомление из синхронизированного блока кода, например:

synchronized(object) {
    object.wait();
}

Если вы только делаете

object.wait();

IllegalMonitorStateException выбрасывается, потому что текущий поток не получил блокировку объекта с помощью синхронизации.

Если вы заблокируете другой объект без монитора блокировки, он также будет сгенерирован:

synchronized(object) {
    someOtherObject.wait();
}
Другие вопросы по тегам