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

标签 java synchronized klocwork

当调用 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/

相关文章:

java - “fileInputStream”在退出时未关闭。

java - Apache HttpClient 在使用 Wily 代理时抛出异常

java - JTextField 上的 setBorder 不起作用?或者是吗?

java - 何时使用 DFS 和 BFS

java - 我可以在 java 中同步块(synchronized block)之外的共享字段上检查 null 吗?

java - 调用notify()后什么时候锁才真正释放

c - Not null terminated string - 没有可理解原因的 KlocWork 错误

c++ - 如何指定符合 MISRA C++ 的字 rune 字?

java.sql.Date错误如何避免?将日期插入我的数据库

Java线程死锁问题