notifyAll() 会发生啥? [复制]
Posted
技术标签:
【中文标题】notifyAll() 会发生啥? [复制]【英文标题】:What happens on notifyAll()? [duplicate]notifyAll() 会发生什么? [复制] 【发布时间】:2016-02-19 01:00:31 【问题描述】:我知道只有一个线程会获得监视器锁。 但是在低级别的所有其他 wait() ing 线程会发生什么? (因为他们都被通知了) 他们都会醒来并进入某种昂贵的自旋锁吗? 还是他们会再次回到被锁上的状态? 寻找低级别的细节 - 特别是试图查看 CPU 是否会因此而被消耗?
另外,当一个线程在监视器上等待时,实际的操作系统线程是否在幕后从它那里拿走了? (这样操作系统线程就可以用来做有用的工作了)
【问题讨论】:
javadoc 说发生了什么? 顾名思义:notifyAll()
将通知(唤醒)所有在特定对象上等待(使用wait()
)的线程!所有线程都执行wait()
之后的下一行
我想说,如果这些中的任何一个在您的用例中很重要(性能方面),您就会知道细节。文档建议使用notifyAll()
,所以我建议你继续这样做,不要担心你的 CPU。
【参考方案1】:
链接问题的答案并未具体解决这些问题。
通过 notifyAll 通知的线程被唤醒,然后它们尝试获取它们被阻塞等待的锁(以及任何想要获取锁的新到达的线程)。调度器选择一个获胜者,失败者重新开始阻塞。
操作系统线程不会从 Java 线程对象(操作系统级别的线程块)中重新分配。您可以通过观察性能监控工具中的线程来确认这一点。调度和阻塞都发生在 OS 级别(绿色线程除外,线程由 JVM 模拟)。
【讨论】:
[谢谢。 (是的,链接的问题根本没有回答我的问题——在发布之前我已经在谷歌上搜索过答案)。 ]以上是关于notifyAll() 会发生啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章