Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: monitor, ownership, synchronized

Можно ли вызывать wait() и notify() вне synchronized-блока и почему?

Вопрос проверяет понимание мониторов объектов и правил безопасной синхронизации потоков.

Короткий ответ

Нет, вызывать wait() и notify() вне synchronized-блока нельзя.
Если попытаться это сделать, будет выброшено IllegalMonitorStateException.
Это связано с тем, что данные методы работают только с монитором объекта.
Поток должен владеть монитором, чтобы управлять ожиданием других потоков.
Так Java защищает модель синхронизации от ошибок.

Длинный ответ

Чтобы понять причину ограничения, нужно сначала разобраться, как работает монитор объекта.

Почему требуется synchronized

Определение:
Монитор объекта — это механизм, который гарантирует, что только один поток в момент времени выполняет код, защищённый synchronized.

Перед началом вызова wait() или notify() поток обязан:

  1. Захватить монитор объекта.

  2. Работать внутри synchronized (obj) или синхронизированного метода.

Что произойдет при нарушении правила

Если вызвать:

lock.wait();

без synchronized, JVM:

  1. Проверяет, владеет ли поток монитором lock.

  2. Обнаруживает, что монитор не захвачен.

  3. Выбрасывает IllegalMonitorStateException.

Логика такого ограничения

Это сделано для того, чтобы:

  1. Исключить гонки данных.

  2. Гарантировать атомарность проверки условий.

  3. Обеспечить корректное освобождение и повторный захват монитора.

Корректный шаблон:

synchronized (lock) {
    while (!condition) {
        lock.wait();
    }
}

Краткий вывод

wait() и notify() нельзя вызывать вне synchronized, потому что они управляют монитором объекта, а доступ к монитору возможен только при его захвате.

Уровень

  • Рейтинг:

    5

  • Сложность:

    5

Навыки

  • Java

    Java

Ключевые слова

#monitor

#ownership

#synchronized

Подпишись на Java Developer в телеграм