【发布时间】:2015-01-14 07:53:39
【问题描述】:
当我阅读java.util.concurrent.locks.Condition API 文档时,
我明白了:
在等待条件时,允许“虚假唤醒” 通常,作为对底层平台的让步 语义。这对大多数应用程序几乎没有实际影响 作为条件的程序应始终在循环中等待, 测试正在等待的状态谓词。一个 实现是免费的,以消除虚假唤醒的可能性 但建议应用程序程序员始终假设 它们可能会发生,因此总是在循环中等待
awaitUninterruptibly() 说:
如果当前线程进入此状态时设置了中断状态 方法,否则在等待中被打断,会继续等待 直到发出信号。当它最终从此方法返回时 仍将设置中断状态
那么,这是否意味着 我们不需要在循环中调用 awaitUninterruptibly() ?请澄清。提前致谢。
【问题讨论】:
-
中断不是虚假唤醒,它们仍然可能发生。
-
@PeterLawrey 调用 awaitUninterruptibly() 的线程会继续等待直到发出信号,而不是处于循环中?
-
仅当它没有虚假唤醒时。
-
@PeterLawrey 感谢您的揭秘。现在明白了,建议我们在循环中调用任何
wait()s 来处理虚假唤醒。 -
总是在循环中等待()。在某些应用程序中——甚至可能——当一个线程重新获得锁并从 wait() 调用返回时,它正在等待的条件已经因为某些人的活动而再次变为 false其他线程。即使在您今天编写的应用程序中不会发生这种情况,循环也不会损害性能,并且始终使用循环的习惯可能会防止您在 next 中犯错误应用程序。
标签: java multithreading concurrency wait