Многопоточность middle
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.