请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

线程阻塞状态如何理解?

在线程状态上面描述阻塞(Blocked):等待获取排它锁,但是图片上面写的是阻塞(doesn’t release any lock or monitor),且第二幅图显示进入阻塞执行的是sleep,而Thread.sleep只会让出CPU,不会导致锁行为的改变,请问具体以哪个为准?
图片描述图片描述

正在回答

1回答

同学好,图的界定比较模糊,synchronized会导致线程进入Blocked状态,Object.wait()导致线程进入Waiting状态,Waiting线程被其他线程调用Object.notify()唤醒之后,重新获取对象上的锁的时候也会进入Blocked状态或者runnable状态,而blocked则是等待后去排它锁,并不会导致它释放锁。

上面说的synchronized也会进入blocked状态,图里没有体现,图里将限期等待和阻塞放在了一起统一变成阻塞了,调用sleep会进入限期等待,具体可以看看源码的注释,因此以第一个为准,带来误解深感歉意:)

/**
 * Thread state for a waiting thread with a specified waiting time.
 * A thread is in the timed waiting state due to calling one of
 * the following methods with a specified positive waiting time:
 * <ul>
 *   <li>{@link #sleep Thread.sleep}</li>
 *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
 *   <li>{@link #join(long) Thread.join} with timeout</li>
 *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
 *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
 * </ul>
 */
TIMED_WAITING,


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信