Многопоточность middle
Почему wait() нужно проверять в while, а не if?
Ответ
Из-за spurious wakeup — поток может проснуться сам по себе. После пробуждения условие может быть уже невалидным.
Разбор: Ключ — spurious wakeup: поток может проснуться без notify, поэтому после пробуждения условие нужно перепроверить, и только while это обеспечивает. Дополнительно while защищает от ситуации, когда между пробуждением и повторным захватом монитора другой поток уже изменил условие. Дистракторы путают: notify() будит один поток (это notifyAll() — всех), компилятор не запрещает wait() в if, а про «минимум дважды» — выдумка.
Хочешь так же по своей компании — с вопросами по грейдам и задачами? Закажи гайд или забери свежее в Telegram.