在Object上调用notify(),其中没有其他线程在等待相同的Object成本

时间:2013-01-28 14:38:20

标签: java multithreading performance optimization notify

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

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

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

当另一个线程将一个Object添加到队列时,无论工作线程是否在实际等待,它都会在Object上调用工作线程将等待的通知。

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

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

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

如果你不阻止工作者线程,那么它将是一个忙等待“spinloop”模式,例如类似的东西:

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

我今天一直在阅读有关这种条件等待的模型(关于我自己的问题:))并找到了关于这种模型何时可能表现出优于普通wait() - {{1}方案:

  

......主要的例外情况是,你以某种方式知道条件必须在一段非常短暂的时间内成为现实。在这种情况下,浪费的时间可能少于暂停和恢复线程所需的时间。

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