gpt4 book ai didi

java - 具有等待和通知的 3 个线程的死锁行为

转载 作者:行者123 更新时间:2023-12-01 09:27:39 29 4
gpt4 key购买 nike

我有 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 循环时,就会发生死锁。我的问题不在于它发生了,因为这正是我正在测试的,而在于它何时发生。两个线程完成后是否应该发生死锁,因为剩下一个线程无法被已完成的两个线程中的任何一个通知?
当然,有可能两个线程同时调用它们的“等待”,因此在一个完成的线程之后我们就会陷入死锁,因为两个等待的线程无法被完成的线程唤醒,但我已经运行了多次测试次,结果总是相同的:仅在一个完成的线程后发生死锁。

我错过了什么吗?

最佳答案

无论是否有东西需要等待,wait 函数都会等待。在调用 wait 之前,您必须检查您想要等待的事情是否已经发生 - 这就是为什么您处于 synchronized block 中,以便您持有保护您正在等待的共享状态的锁。

如果没有等待达到某个特定状态的共享状态,您将永远无法让 wait/notifyAll 工作。您必须使用锁来保护该共享状态,并且必须在调用 wait 之前检查其状态。否则,你总会有可能的比赛,包括你所看到的比赛,你等待某件事发生,即使它已经发生了,从而永远等待。

关于java - 具有等待和通知的 3 个线程的死锁行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39714351/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com