wait/notify — почему while?

Ответ

Spurious wakeup: JVM/ОС может разбудить поток без notify. while (!condition) { wait(); }. Важно: вызывать ТОЛЬКО внутри synchronized на том же объекте, иначе — IllegalMonitorStateException. notify() будит один поток, а при notifyAll просыпаются несколько — условие нужно перепроверить, поэтому if недостаточно, только while.

Разбор: while нужен прежде всего из-за spurious wakeup — поток может проснуться без notify, и условие надо перепроверить. Дополнительно при notifyAll проснувшихся несколько, а ресурс достанется одному. Дистракторы ошибочны: if недостаточно (условие после пробуждения может быть ложным), spurious wakeup реален и в текущих JVM, а потерянный notify while не лечит — это отдельная проблема, решаемая правильным порядком работы под одним монитором.

Хочешь так же по своей компании — с вопросами по грейдам и задачами? Закажи гайд или забери свежее в Telegram.

Заказать гайд Пройти тест
новые гайды и свежие вопросы с собесов — первыми в Telegram Смотреть гайды Подписаться