Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么';同步块内的wait()方法';有可能吗?_Java_Synchronized_Klocwork - Fatal编程技术网

Java 为什么';同步块内的wait()方法';有可能吗?

Java 为什么';同步块内的wait()方法';有可能吗?,java,synchronized,klocwork,Java,Synchronized,Klocwork,klocwork JD.LOCK.WAIT问题是在对象.WAIT()方法持有两个或多个锁时调用该方法时报告的 klocwork说,在持有两个锁的情况下等待监视器可能会导致死锁,应该考虑这个问题 但我不明白这为什么会导致僵局 谁能帮我理解这个问题 以下代码来自klockwork。JD.LOCK.WAIT问题发生在第14行LOCK.WAIT() 假设t1进入waitForCondition()方法。所以t1现在有这个作为锁。同时,另一个线程刚刚获取了lock对象,正在尝试调用waitForConti

klocwork JD.LOCK.WAIT问题是在对象.WAIT()方法持有两个或多个锁时调用该方法时报告的

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

但我不明白这为什么会导致僵局

谁能帮我理解这个问题

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

假设t1进入
waitForCondition()
方法。所以t1现在有
这个
作为锁。同时,另一个线程刚刚获取了
lock
对象,正在尝试调用
waitForContion()

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

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

这是一个僵局。他们两人都不能取得任何进展,正在互相等待

为了避免这种情况,一种策略是确保任何线程都拥有完成任务所需的所有资源。这里它意味着
lock
this
只能一起获取,而不能以其他方式获取


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

如果我将同步方法的参数从object lock更改为byte[]命令(例如),我不需要担心死锁?我看不出这会有什么帮助。有两个锁(
对象和
对象),您希望同时获取它们并将其释放。
String name;
synchronized void waitForCondition(Object lock) {
    try {
        synchronized(lock) {
            name = "aa";
            lock.wait();            //line 14
        }
    } catch (InterruptedException e) {
        return;
    }
}