2

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

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

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

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

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

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

我在这里先向您的帮助表示感谢 :)

4

1 回答 1

0

如果您不阻塞工作线程,它将是一个忙等待“自旋循环”模式,例如:

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

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

...主要的例外情况是您以某种方式知道条件必须在非常短的、有限的时间内变为真实的情况。在这种情况下,浪费的时间可能少于挂起和恢复线程所需的时间。

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

于 2013-01-28T14:50:31.617 回答