Now I see that the code snippet in TimeUnit.timedWait is also in need of fixing. Hmmmm .... public synchronized Object poll(long timeout, TimeUnit unit) throws InterruptedException { while (empty) { unit.timedWait(this, timeout); ... } }