gpt4 book ai didi

java - 为什么 'wait() method within synchronized block'有可能出现死锁?

转载 作者:行者123 更新时间:2023-12-01 14:11:47 25 4
gpt4 key购买 nike

当调用 Object.wait() 方法且该方法持有两个或更多锁时,会报告 klocwork JD.LOCK.WAIT 问题。

klocwork 表示,在持有两个锁的情况下等待监视器可能会导致死锁,应该考虑到这个问题。

但我不明白为什么这会导致死锁。

谁能帮我理解这个问题?

以下代码来自 klockwork。 JD.LOCK.WAIT 问题发生在第 14 行 lock.wait();

String name;
synchronized void waitForCondition(Object lock) {
try {
synchronized(lock) {
name = "aa";
lock.wait(); //line 14
}
} catch (InterruptedException e) {
return;
}
}

最佳答案

假设t1进入waitForCondition()方法。所以t1现在有this作为锁。与此同时,其他一些线程刚刚获取了lock对象并尝试调用waitForContion()

  • t2 持有lock,但正在等待this进入waitForContion()

  • t1 持有 this,但正在等待 lock 退出 waitForContion()

这是一个僵局。两人都无法取得任何进展,只能互相等待。

为了避免这种情况,一种策略是确保任何线程都拥有完成所需的所有资源。这里的意思是lockthis只能一起获取,否则不能获取。

此外,当调用 lock.wait() 时,仅释放 lock,而 this 则不会。因此,在这种情况下,没有线程可以在对象上调用waitForContion()

关于java - 为什么 'wait() method within synchronized block'有可能出现死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18481850/

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