使用下面的代码是否有造成死锁的风险?有更好/更安全的方法吗?最初,我考虑过以某种方式将两个锁组合在一起,但是也许我在这里太用力了,下面的代码是安全正确的。
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
同时运行时,可能会产生死锁。