在对象上调用notify()
的成本是多少,其他对象在Java中没有调用wait()
?
我对此感兴趣的原因是因为我有一个具有对象队列的工作线程。
线程循环不断检查队列中是否有任何需要使用的对象。如果它循环并且所述队列中没有任何内容,则线程调用等待单独的Object。
当另一个线程将一个Object添加到队列时,无论工作线程是否在实际等待,它都会在Object上调用工作线程将等待的通知。
在任何人说出任何内容之前,它都是正确同步的,并且不会抛出任何异常/错误。
我的问题是:这个设置是否慢,然后让工作线程继续检查并且永远不会调用wait()
,如果没有任何线程等待对象,调用notify()
的成本是多少?
感谢您的帮助:)
答案 0 :(得分:0)
如果你不阻止工作者线程,那么它将是一个忙等待“spinloop”模式,例如类似的东西:
while (queue.isEmpty()) {
Thread.yield();
}
我今天一直在阅读有关这种条件等待的模型(关于我自己的问题:))并找到了关于这种模型何时可能表现出优于普通wait()
- {{1}方案:
......主要的例外情况是,你以某种方式知道条件必须在一段非常短暂的时间内成为现实。在这种情况下,浪费的时间可能少于暂停和恢复线程所需的时间。
这本书是Doug Lea的“Java中的并行编程:设计原则和模式”。