다음 코드처럼 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)