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() 会发生啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

函数返回时堆栈会发生啥? [复制]

循环中的 Lambda 变量捕获 - 这里会发生啥? [复制]

当 Promise 永远不会解决时会发生啥? [复制]

如果在 java 中没有指定修饰符会发生啥? [复制]

C - free() 之后内存会发生啥? [复制]

当 python 添加小整数时,幕后会发生啥? [复制]