关于Java线程状态转换中的wait()被唤醒时进入的状态的疑问

先看传统的状态转换图(深入理解Java虚拟机中用的就是这个)

我的疑问是我们知道调用wait()方法的时候会释放锁。那当调用notify后他就需要重新获取锁,

获取锁不是要进入阻塞队列吗,那就应该进入blocked状态啊。 为什么他直接进入running 状态了?

我感觉他错了。wait被唤醒后应该先进入blocked状态,而不是直接进入Runing。

我又找到了一个关于线程状态的一个比较全面的转换图(来源于:Java线程状态和生命周期

他说的比较正确

Thread is in the Blocked state while waiting for the monitor lock to enter a synchronized block or method or to reenter a synchronized block or method after calling Object.wait().

在等待监视器锁定进入同步块或方法(synchronize)或在调用Object.wait()后重新输入同步块或方法时, 线程处于阻塞(Blocked)状态。

人家就是这样定义的。

可以这样理解:
阻塞状态是等待获取锁的状态,Object.wait()导致线程进入Waiting状态,由于调用wait()时会释放占用的cpu资源和锁,所以当Waiting线程被其他线程调用Object.notify()唤醒之后,需要重新获取对象上的锁。这时候 也会先进入Blocked状态

关于线程状态转换详情可以看这里 Java线程状态和生命周期

猜你喜欢

转载自my.oschina.net/zjllovecode/blog/1630716