0

当调用 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;
    }
}
4

1 回答 1

1

可以说t1进入waitForCondition()方法。所以t1现在有this一个锁。同时,其他一些线程刚刚获取lock对象并正在尝试调用waitForContion()

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

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

那是一个僵局。他们俩都无法取得任何进展,都在等待对方。

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

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

于 2013-08-28T07:37:32.780 回答