java - 在没有其他线程等待相同对象成本的对象上调用 notify()

标签 java multithreading performance optimization notify

在 Java 中没有其他对象调用过 wait() 的对象上调用 notify() 的相关成本是多少?

我对此感兴趣的原因是因为我有一个工作线程,它有一个对象队列。

线程不断循环检查队列中是否有任何需要处理的对象。如果它循环并且所述队列中没有任何内容,则线程调用等待一个单独的对象。

当另一个线程将一个对象添加到队列时,它会调用对象上的通知,通知工作线程将等待,而不管工作线程是否真的在等待。

在任何人说话之前,它都已正确同步并且不会抛出任何异常/错误。

我的问题是:这个设置是否比让工作线程继续检查并且从不调用 wait() 更慢,调用 notify() 的成本是多少没有任何线程在等待对象?

提前感谢您的帮助:)

最佳答案

如果您不阻塞工作线程,它将是一个忙等待“spinloop”模式,例如像这样的东西:

while (queue.isEmpty()) {
  Thread.yield();
}

我今天一直在阅读这种有条件等待的模型(关于我自己的问题 :))并发现了以下关于这种模型何时可能表现出优于普通 wait() 的注释- notify() 方案:

... The main exceptions are those cases in which you somehow know that the condition must become true within some very short, boudned amount of time. In such cases, the time wasted spinning might be less than the time required to suspend and resume threads.

这本书是 Doug Lea 的“Java 并发编程:设计原则和模式”。

关于java - 在没有其他线程等待相同对象成本的对象上调用 notify(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14564377/

相关文章:

java - 我可以在没有明确提供 XSL 文件的情况下进行 XSL 转换吗?

java - 从 jscript 获取字符串值到 servlet

java - 与 Spring 的 Tomcat jdbc 池

java - 如何实现将结果返回给事件调度线程的方法?

java - 打印在java中产生错误的输出

java - WebLogic 上 Jenkins 的 LinkageError

c++ - 用于 vector 处理的多个线程

java - Java 中使用堆栈的生产者-消费者

java - 此功能的最佳情况是什么?

scala Spark数据帧爆炸很慢 - 所以,替代方法 - 从列中的数组创建列和行