先看传统的状态转换图(深入理解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线程状态和生命周期