Мне было интересно, почему потоки спонтанно просыпаются от wait() в java.
Это дизайнерское решение? Это компромисс?
EDIT: (из Java Concurrency на практике, стр. 300)
wait
даже разрешено возвращать "ложно" - не в ответ на какие-либо уведомление о потоке.
Далее авторы заявляют:
это похоже на тостер с рыхлым соединение, которое заставляет звонок погаснуть когда тост готов, но также иногда, когда он не готов.
Вот почему вы всегда должны кодировать как
synchronized(this){
while(!condition)
wait();
}
}
и никогда
synchronized(this){
if(!condition){
wait();
}
}
Даже если условие переходит только из
false
до true
.