线程阻塞状态如何理解?
来源:8-5 线程的状态

黑马非马1013
2019-07-23
在线程状态上面描述阻塞(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,
012019-07-25
相似问题