使用下面的代码是否有造成死锁的风险?有更好/更安全的方法吗?最初,我考虑过以某种方式将两个锁组合在一起,但是也许我在这里太用力了,下面的代码是安全正确的。

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不能在没有lock2锁定的情况下锁定lock1,因此该方法不会发生死锁。请注意,这不会阻止未显示的某种其他代码在lock2之前获取lock1,例如

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


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

09-25 20:39