为什么'synchronized块'中的'wait()方法有死锁的可能性?

时间:2013-08-28 07:34:24

标签: 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;
    }
}

1 个答案:

答案 0 :(得分:1)

让我们说 t1 进入waitForCondition()方法。所以 t1 现在有this作为锁。与此同时,其他一些线程刚刚获得了lock个对象,正在尝试调用waitForContion()

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

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

这是死锁。他们俩都没有取得任何进展,而是在互相等待。

为避免这种情况,一种策略是确保任何线程都具有完成所需的所有资源。这意味着lockthis只能一起获得而不是其他方式。

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