Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 是否可能使用两个锁和一个方法死锁,而所有其他方法只获取一个锁?_Java_Multithreading_Concurrency_Locking_Cas - Fatal编程技术网

Java 是否可能使用两个锁和一个方法死锁,而所有其他方法只获取一个锁?

Java 是否可能使用两个锁和一个方法死锁,而所有其他方法只获取一个锁?,java,multithreading,concurrency,locking,cas,Java,Multithreading,Concurrency,Locking,Cas,使用下面的代码是否会有死锁的风险?有没有更好/更安全的方法?起初我想把两个锁组合成一个锁,但也许我在这里做得太努力了,下面的代码是安全和正确的 public void method1() { lock1.lock(); //... lock1.unlock(); } public void method2() { lock2.lock(); //... lock2.unlock(); } public void method3() { loc

使用下面的代码是否会有死锁的风险?有没有更好/更安全的方法?起初我想把两个锁组合成一个锁,但也许我在这里做得太努力了,下面的代码是安全和正确的

public void method1() {

    lock1.lock();
    //...
    lock1.unlock();
}

public void method2() {
   lock2.lock();
   //...
   lock2.unlock();
}

public void method3() {
   lock1.lock();
   lock2.lock();
   // ...
   lock2.unlock();
   lock1.unlock();
}

在这种情况下,
method3
无法在未锁定
lock1
的情况下锁定
lock2
,因此该方法中不会发生死锁。请注意,这不会阻止在
lock1
之前未显示的获取
lock2
的某种附加代码,例如

public void method4() {
   lock2.lock();
   lock1.lock();
   // ...
   lock1.unlock();
   lock2.unlock();
}

当与
method3
同时运行时,这可能会产生死锁。

这永远不会死锁,不会。死锁只会发生在两个线程中,每个线程都有两个或多个锁发生故障。@Gary您能提供一个使用上述方法的示例,在其中您可以产生死锁吗?您了解什么是死锁吗?在你的代码中,你怀疑在哪里会发生这种情况?