There seems to be a discrepancy between SO consensus and nearly every Java thread state diagram on the Internet; specifically, regarding thread state transition from WAITING
after notify()
or notifyAll()
is invoked...
So the concensus on SO is: a thread transitions from WAITING
to BLOCKED
after invoking notify()
or notifyAll()
; diagram below illustrates this transition in green.
Why do most state diagrams on the web illustrate the transition from WAITING
to RUNNABLE
, not BLOCKED
? Depiction in red shows the incorrect transition; am I missing something?
Any diagram that shows a notify
invocation bringing a thread from WAITING to RUNNABLE is wrong (or is using an unclarified shortcut). Once a thread gets awoken from a notify
(or even from a spurious wakeup) it needs to relock the monitor of the object on which it was waiting. This is the BLOCKED
state.
Thread state for a thread blocked waiting for a monitor lock. A thread in the blocked state is waiting for a monitor lock to enter a synchronized block/method or reenter a synchronized block/method after calling
Object.wait
.
This is explained in the javadoc of Object#notify()
:
The awakened thread will not be able to proceed until the current thread relinquishes the lock on this object.
and Object#wait()
The thread then waits until it can re-obtain ownership of the monitor and resumes execution.