【发布时间】:2016-01-16 03:20:36
【问题描述】:
我在“Thinking in java”中阅读了以下代码。
synchronized(obj)
{
while (condition_not_matched)
{
obj.wait();
}
//continue
dosomething();
}
我的想法:
使用“if”就可以了,因为“wait”意味着它必须得到obj的锁监视器,并且这里只能执行一个线程。
(1)为什么这里使用“while(条件)”而不是“if”?
(2)执行“obj.wait()”时发生了什么?当前线程是否释放“obj”的锁?
(3)当另一个线程执行“obj.notify()”时,前一个线程发生了什么(它是否重新获取了obj的锁?如果是,它必须condition_not_matched,所以“if”就足够了。)
我错了吗?
【问题讨论】:
-
一切都可以通过阅读wait()和notify()的javadoc(还有notifyAll(),应该是首选)来回答。
-
我不会说
notifyAll“应该是首选”。有合适的情况,也有不合适的情况。 -
@Wyzard,notifyAll() 应该首选的一种情况是,如果您向不完全了解自己在做什么的新手提供一口大小的建议。如果在可以使用 notify() 的情况下使用 notifyAll(),唯一的后果是程序的性能不如它可能做的那样好。如果你在应该使用 notifyAll() 的地方使用 notify(),那么后果可能比这更糟。
标签: java multithreading while-loop wait