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行?谢谢。
发布于 2014-05-21 17:44:36
通知的线程需要重新获取锁,但是这种重新获取发生在等待调用中,并且线程一旦从等待方法返回,就会有锁,然后在第3行开始执行。彼得的回答是正确的(+1)。
javadoc等待支持这一点,它说:
然后,将线程T从此对象的等待集中移除,并重新启用线程调度。然后,它以通常的方式与其他线程竞争对象上的同步权;一旦它获得了对对象的控制,它对对象的所有同步要求就会恢复到原状--即恢复到调用等待方法时的状态。线程T然后从等待方法的调用返回。因此,在等待方法返回时,对象和线程T的同步状态与调用等待方法时完全相同。
你可以试试这个。如果线程必须在块顶部重新启动,那么您可以通过一个If测试来检查条件,因为一旦通知了线程,它仍然必须通过条件测试。如果线程恢复到它停止的位置,则需要while循环,因为线程需要检查必须等待的条件是否仍然为真。如果您用If语句替换while循环并运行多线程测试(例如,您可以创建一个队列,一个本地队列,您可以在这个队列中篡改其put和test方法,使用多个生产者和使用者等待队列为非空),那么您应该能够看到线程等待的情况,即使条件不应该让它继续进行(结果是试图从一个空队列中获取一些东西)。
发布于 2014-05-21 17:23:41
在第3行,线程执行是线性的,它
不能回去,也不能跳到那样的地方。
https://stackoverflow.com/questions/23789987
复制相似问题