线程阻塞状态如何理解?

来源:8-5 线程的状态

黑马非马1013

2019-07-23

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

写回答

1回答

翔仔

2019-07-23

同学好,图的界定比较模糊,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
1
黑马非马1013
非常感谢!
2019-07-25
共1条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8441 学习 · 1872 问题

查看课程