더북(TheBook)

다음 코드처럼 B → C 순서로 잠그는 것도 역시 안전합니다.

lock(B)
lock(C)

“A를 잠그지 않았는데?”라고 걱정할 필요가 없습니다. 거꾸로만 잠그지 않으면 됩니다. A를 잠그지 않았더라도 B와 C만 놓고 볼 때 잠금 순서를 어기지는 않았습니다.

B만 잠그는 것 역시 안전합니다. 거꾸로 잠그지 않았으니까요. 마찬가지로 C만 잠그는 것도 안전합니다. B만 잠그고 C만 잠그는 것을 코드 하나로 표현한다면 다음과 같겠습니다.

lock(B)    // B를 잠갔다.
unlock(B)  // B가 해제되었다.
lock(C)    // C를 잠갔다. B가 이미 해제되었으므로 C만 잠근 셈이다.
unlock(C)  // C가 해제되었다.

흥미롭게도 A → C 순서로 잠그는 것도 안전합니다. B를 건너뛰었지만, 어쨌거나 의 잠금 순서를 보았을 때 거꾸로 가지는 않았기 때문입니다.

lock(A)
lock(C)
unlock(C)
unlock(A)

B → A 순서로 잠그면 그제야 교착 상태를 일으킬 수 있습니다. 의 잠금 순서를 어겼기 때문입니다.

lock(B)
lock(A)
unlock(A)
unlock(B)
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.