重新访问了对象wait()和notify()

时间:2013-08-05 10:27:30

标签: java multithreading concurrency jvm synchronized

虽然关于这个话题有很多文章和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.}

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

编辑:“第4行代码只执行一次”错误的假设。同步块中的线程在从休眠状态恢复后重新获取锁定,如answer.Thanks

中所述

2 个答案:

答案 0 :(得分:1)

它的工作原理如the javadoc for Object#wait所述,强调我的:

  

线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。 线程然后等待,直到它可以重新获得监视器的所有权并继续执行。

因此,一旦通知等待线程,它将在继续执行下一条指令之前重新获取监视器(在您的情况下:while(!condition))。

答案 1 :(得分:0)

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