wait()
всегда следует использовать следующим образом:
while(condition not met)
wait();
В противном случае некоторые потоки могут проснуться и продолжить работу, если условие все еще не выполнено. Есть две возможные причины этой ситуации:
- Когда вы вызываете
notifyAll()
, вы пробуждаете все ожидающие потоки, поэтому некоторые из них могут быть слишком поздними, когда условие снова ложно (т.е. когда ограниченный ресурс уже исчерпан другими потоками).
- Существует возможность ложного пробуждения (т. Е. Поток просыпается без соответствующего
notify
).
Если вам действительно нужно разбудить только один поток, вы можете использовать notify()
вместо notifyAll()
. Это устраняет первую проблему, но по-прежнему не может защитить вас от ложных пробуждений, поэтому требуется while
.