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

时间:2014-02-21 19:15:14

标签: java multithreading concurrency locking cas

使用下面的代码是否存在死锁的风险?这样做有更好/更安全的方法吗?最初我想过将两个锁组合成一个,但也许我在这里推得太猛,下面的代码是安全和正确的。

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();
}

1 个答案:

答案 0 :(得分:2)

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

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

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