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行?谢谢。
答案 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方法的本地队列,有多个生产者和消费者,消费者是等待队列非空)然后你应该能够看到线程等待的情况,然后继续进行,即使条件不应该让它(导致尝试从空队列中取一些东西)。