我有三根线,三条线都在做“.”(例如,写信给一份清单,我们在其中同步):
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-循环时,就会出现死锁。我的问题不是它发生了,因为这正是我所测试的,而是它发生的时候。死锁不应该在两个线程完成之后发生吗?因为还有一个线程不能由两个线程中的任何一个来通知?
当然,有可能两个线程同时调用它们的“等待”,所以在一个线程完成后就会出现死锁,因为两个等待线程不能被已完成的线程唤醒,但是我已经多次运行测试,结果总是一样的:只完成一个线程之后的死锁。
我是不是遗漏了什么?
发布于 2016-09-27 00:37:29
无论是否需要等待,wait函数都会等待。在调用wait之前,您必须检查您想要等待的东西是否已经发生--这就是您处于synchronized块中的原因,以便您持有保护您正在等待的共享状态的锁。
如果没有等待到达特定状态的共享状态,wait/notifyAll将永远无法工作。您必须使用锁来保护该共享状态,并且必须在调用wait之前检查其状态。否则,你总是会有可能的比赛,包括你所看到的比赛,即使事情已经发生,你也在等待它的发生,因此你将永远等待。
https://stackoverflow.com/questions/39714351
复制相似问题