2013-08-05 118 views
1

虽然有很多关于这个主题的文章和SO帖子,我仍然有一些疑问。所以请帮助我理解。说我写:对象等待()和通知()重访

1.Class A(){} 
2.public static void main(String[] s){ 
3. A obj= new A(); 
4. synchronized(obj){ 
5.  while(!condition) 
6.   obj.wait(); 
7. } 
8.} 

现在根据解释,如果我们不使用同步块,线程从睡眠唤醒可能会松动通知。但第6行释放了对obj的锁定,即其监视器由另一个线程拥有。 现在,当该线程调用notify()时,由于obj的监视器不属于此线程,因此该线程如何得到通知。此外,第4行代码只执行一次,而不是此线程的每个唤醒事件。那么wait()之前同步的是什么?

编辑:“第4行代码只执行一次”错误的假设。在answer.Thanks

+1

如果不使用synchronized块,'wait'会抛出异常下手......(和'wait'只有重新获得监视器后返回。) –

回答

1

它工作在the javadoc for Object#wait的解释中提到它们从休眠恢复后同步块中的线程获取锁定,重点煤矿:

这款显示器并等待线程释放所有权,直到另一个线程通知调用notify方法或notifyAll方法来唤醒等待该对象监视器的线程。 线程然后等待,直到它可以重新获得显示器的所有权并恢复执行。

所以一旦等待的线程被通知,之前进行下指令(:while(!condition)你的情况)重新获得监视器

0

“那么究竟什么是等待()之前同步需要什么?” :条件在线程中共享,条件中的任何更改都应该是线程安全的,并且是进行同步的原因。这里的条件不是一些随机的条件,但这是你的线程正在等待的东西。 希望这有助于。