【发布时间】:2014-01-02 13:02:37
【问题描述】:
在我正在阅读的书中说:
由于存在竞争条件,因此需要此技术,否则 在设置和发送通知和测试之间存在 收到通知。如果 wait() 和 notify() 机制是 没有在持有同步锁的时候调用,就不会有 保证收到通知的方法。
不明白这到底是什么意思,为什么会出现竞态条件?
编辑:嗯,我现在看到这可能是 Why must wait() always be in synchronized block 的重复问题 ,但答案似乎集中在使条件检查和等待同步上。
来自 shrini1000 的反例:
我仍然可以这样做:
while(!condition) { synchronized(this) { wait(); } }
这意味着在检查条件和等待之间仍然存在竞争 如果在同步块中正确调用了 wait()。有没有 此限制背后的任何其他原因,可能是由于它的方式 用Java实现?
【问题讨论】:
-
我认为答案不存在,原因是我的问题中的反例。
-
这里没有反例。您的 wait() 调用位于同步块中。
-
其根本原因是内存模型的工作方式 - 您可以查看:docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.2,了解等待集如何工作的详细说明。
-
没有完全找到我要找的东西,但是对于链接 +1
-
有些东西可能被误用的事实并不是一个反例。
标签: java multithreading concurrency wait notify