虽然关于这个话题有很多文章和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
中所述答案 0 :(得分:1)
它的工作原理如the javadoc for Object#wait
所述,强调我的:
线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。 线程然后等待,直到它可以重新获得监视器的所有权并继续执行。
因此,一旦通知等待线程,它将在继续执行下一条指令之前重新获取监视器(在您的情况下:while(!condition)
)。
答案 1 :(得分:0)
“那么在等待()之前需要同步的是什么?” :条件在整个线程中共享,条件的任何更改都应该是线程安全的,这是同步的原因。这里条件不是一些随机条件,但这是你的线程要等待的东西。 希望这会有所帮助。