ReentrantLock의 기능은 해제 책임과 실패 경로를 함께 늘립니다.
synchronized로 범위를 구조화
tryLock(timeout)
lockInterruptibly
Condition 분리
핵심: 단순 상호 배제라면 synchronized가 더 작은 계약입니다.