在重量级锁的情况下等待池里的线程被notify以后会进入什么状态?

发布于 2022-09-12 02:32:36 字数 614 浏览 11 评论 0

是关于synchronized关键字的使用
1.对于重量级锁线程在未竞争到锁时会被阻塞,然后以阻塞(blocked)状态进入锁池(Entry Set)中,等待锁释放,并重新竞争锁。
2.对于执行到wait()方法的线程会变成waiting状态,进入等待池

总之等待池中的线程都是waiting状态,锁池的线程都是blocked状态,以上是我的理解,如果有错误请大家指出。

问题在于,notify()/notifyAll()方法执行后,等待池的线程是不是直接由waiting状态变成blocked状态转移到锁池?进入锁池之前会不会先转变成runnable状态?
提出这个疑问是因为看到了这篇文章:你真的懂wait、notify和notifyAll吗

其中提到:

当对象的notify()方法被调用时,JVM会唤醒处于Wait Set中的某一个线程,这个线程的状态就从WAITING转变为RUNNABLE;或者当notifyAll()方法被调用时,Wait Set中的全部线程会转变为RUNNABLE状态。

这一点让我感到很疑惑

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

丑丑阿 2022-09-19 02:32:36

疑惑点在哪呢?
notify唤醒线程后,线程当然是RUNNABLE状态的,然后它要去争夺锁,没抢到就BLOCK啊

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文