java – 等待JVM处理的对象锁导致线程处于阻塞状态的方式

我已经看到线程可以通过不同的方式进入阻塞状态.我很想知道线程处于阻塞状态后到底发生了什么.它如何回到运行状态.如果它被睡眠(时间)阻止,那么它会在毫秒之后移动到可运行队列.如果它在I / O操作上被阻塞,那么一旦完成它就会进入可运行队列.
它在等待对象锁时如何到达可运行队列.它是如何知道它等待的对象的锁定现在可用.有人还可以解释I / O上被阻塞线程如何工作的内部结构.
如果我对上述任何主题的理解不正确,请纠正我.

谢谢

最佳答案

How does it get to the runnable queue when it is waiting on an objects lock?

如果线程由于尝试进入同步块而被阻塞,则当另一个线程(持有锁)通过退出同一对象的同步块释放锁时,线程将自动标记为可运行.

如果当前线程由于调用someObject.wait()而被阻塞,则当另一个线程调用someObject.notify()时,线程被“释放”.

在字节码级别上,它看起来如下:

[load some object, obj, onto the operand stack]
monitorenter  // grab the lock

// do stuff

[load obj onto the operand stack again] 
monitorexit   // release the lock

如果其他人已经持有obj的锁,则线程将挂起monitorenter,直到另一个线程调用monitorexit.

JLS未指定monitorenter和monitorexit应如何实现的确切细节.也就是说,它依赖于JVM / OS.

有关详细信息,请参阅JLS Wait Sets and Notifications.

转载注明原文:java – 等待JVM处理的对象锁导致线程处于阻塞状态的方式 - 代码日志