线程执行在另一个线程通知时从哪里开始?

时间:2014-05-21 17:22:15

标签: java multithreading wait synchronized notify

public  void add(int num)
{
 synchronized(myObject){
 // line 1
 //line 2
 while(!condition)
 {
  myObject.wait();
  //line 3
 }    
 //line 4
 //line 5
 //line 6
 }
}

当通知线程T(等待对myObject的锁定)时,
T在哪里开始执行,在第1行或第3行?谢谢。

2 个答案:

答案 0 :(得分:3)

在第3行,线程执行是线性的,它是 不能回去,或者像那样跳到某个地方。

答案 1 :(得分:1)

通知的线程需要重新获取锁,但是重新获取是在等待调用中发生的,并且线程在从wait方法返回后具有锁,然后它开始在第3行执行。{{3是正确的(+1)。

Peter's answer支持这一点,它说:

  

然后从该对象的等待集中删除线程T并重新启用线程调度。然后它以通常的方式与其他线程竞争,以便在对象上进行同步;一旦它获得了对象的控制权,它在对象上的所有同步声明都将恢复到原状 - 即,调用wait方法时的情况。线程T然后从wait方法的调用返回。因此,从wait方法返回时,对象和线程T的同步状态与调用wait方法时的状态完全相同。

你可以测试一下。如果线程必须从块的顶部重新开始,那么你可以通过if测试来检查条件,因为一旦线程被通知它仍然必须使它超过条件测试。如果线程从中断处继续,则需要while循环,因为线程需要检查使其必须等待的条件仍然不正确。如果用if语句替换while循环并运行多线程测试(例如,你可以创建一个队列,一个你可以篡改其put和take方法的本地队列,有多个生产者和消费者,消费者是等待队列非空)然后你应该能够看到线程等待的情况,然后继续进行,即使条件不应该让它(导致尝试从空队列中取一些东西)。