我有3个主题,所有3个主题都做同样的事情" [...]" (例如写入我们同步的列表):
public void run(){
long time= System.currentTimeMillis();
while(System.currentTimeMillis - time < 10000){
synchronized(object){
[...]
object.notifyAll();
object.wait();
}
}
System.out.println(Thread.currentThread.getName() + " just finished");
}
我发现好奇的是,当一个线程退出while循环时,会发生死锁。我的问题不是它发生了,因为它正是我测试的,但是当它发生时。两个线程完成后是否应该发生死锁,因为剩下的一个线程无法通过任何完成的两个线程通知? 当然,两个线程有可能称其为#34;等待&#34;同时,所以我们在一个完成的线程之后得到一个死锁因为两个等待的线程不能被完成的线程唤醒,但是我已经多次运行测试并且结果总是相同的:只有一个完成后死锁线程。
我错过了什么吗?
答案 0 :(得分:1)
wait
函数将等待是否有等待的内容。在致电wait
之前,您必须检查您要等待的事情是否已经发生 - 这就是您在synchronized
块中的原因,以便您持有保护共享状态的锁定你在等待。
如果没有某个共享状态您将等待达到某个特定状态,您永远不会让wait
/ notifyAll
工作。您必须使用锁来保护该共享状态,并且必须在调用wait
之前检查其状态。否则,你将总是有可能的比赛,包括你正在看到的等待发生事情的地方,即使它已经发生,因此永远等待。