使用下面的代码是否存在死锁的风险?这样做有更好/更安全的方法吗?最初我想过将两个锁组合成一个,但也许我在这里推得太猛,下面的代码是安全和正确的。
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();
}
答案 0 :(得分:2)
在这种情况下,method3
无法在lock2
锁定的情况下锁定lock1
,因此在该方法中不会发生死锁。请注意,这不会阻止某些未显示的其他代码在lock2
之前获取lock1
,例如
public void method4() {
lock2.lock();
lock1.lock();
// ...
lock1.unlock();
lock2.unlock();
}
当与method3
同时运行时,会产生死锁。