Java线程状态转换,WAITING to BLOCKED或RUNNABLE?

在SO的共识和互联网上几乎每个Java线程状态图之间似乎都存在差异。具体来说,关于在调用notify()或notifyAll()之后WAITING的线程状态转换…

WAITING never直接进入RUNNABLE
>线程正在等待通知…然后它becomes BLOCKED …
>一旦这个线程被通知,它will not be runnable …这是…已锁定状态。

所以SO上的共识是:在调用notify()或notifyAll()之后,线程从WAITING转换为BLOCKED;下图说明了绿色过渡。

为什么大多数state diagrams on the web说明从WAITING到RUNNABLE的转换,而不是阻塞?红色描述显示不正确的过渡;我错过了什么吗?

显示将线程从WAITING转为RUNNABLE的通知调用的任何图是错误的(或正在使用未标记的快捷方式)。一旦一个线程从一个通知(甚至是一个虚假的唤醒)唤醒,它需要重新锁定它正在等待的对象的监视器。这是BLOCKED的状态。

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.

这在Object#notify()的javadoc中有所解释:

The awakened thread will not be able to proceed until the current
thread relinquishes the lock on this object.

Object#wait()

The thread then waits until it can re-obtain ownership of the monitor
and resumes execution.

http://stackoverflow.com/questions/28378592/java-thread-state-transition-waiting-to-blocked-or-runnable

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Java线程状态转换,WAITING to BLOCKED或RUNNABLE?