교착 상태는 하나 이상의 스레드가 잠금 가능 자원을 통해 루프를 생성 할 가능성에 의해 생성 된 주기적 종속성이있는 경우에만 가능합니다.항상 Java Lock에서 tryLock을 사용하여 데드락을 막을 수 있습니까?
하나의 옵션은 신중한 정적 분석 또는 잠금 획득을위한 디자인 패턴을 통해 이러한 순환을 피하는 것입니다.
그러나 잠금 인터페이스에서 tryLock을 사용하여 교착 상태를 방지 할 수 있습니까? tryLock은 원자 적으로 잠금을 시도합니다. 성공하면 true를 반환하고 잠금 상태이면 false를 반환하여 코드를 건너 뛸 수 있습니다.
int sharedStateA = 0;
int sharedStateB = 0;
Lock lockA = new ReentrantLock();
Lock lockB = new ReentrantLock();
// possible deadlock safe solution
// executed by thread 1
void deadLockSafeUpdateAthenB(){
try {
if (lockA.tryLock()){
sharedStateA = sharedStateA + 1;
try {
if (lockB.tryLock()){
sharedStateB = sharedStateB + 1;
}
} finally {
lockB.unlock();
}
}
} finally {
lockA.unlock();
}
}
// executed by thread 2
void deadLockSafeUpdateBthenA(){
try {
if (lockB.tryLock()){
sharedStateB = sharedStateB + 1;
try {
if (lockA.tryLock()){
sharedStateA = sharedStateA + 1;
}
} finally {
lockA.unlock();
}
}
} finally {
lockB.unlock();
}
}
교착 상태까지는 안전해야하지만 결과 동작이 올바른지 확인해야합니다. – shmosel
자물쇠를 인수하지 않으면 상태 업데이트가 발생하지 않을 수도 있다는 것을 알고 있습니까? 그런 접근법이 유용 할 때 나는 거의 상상하지 못한다. – Anton