繁体   English   中英

为什么“同步块内的wait()方法”有死锁的可能?

[英]Why does 'wait() method within synchronized block' have deadlock possibility?

当一个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 waitForContion()但正在等待lock退出waitForContion()

那是一个僵局 他们两个都无法取得任何进展,彼此都在等待。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM