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