volatile이 가시성을 보장하는 도구라면, synchronized와 Lock은 배타적 실행을 보장하는 도구다.멀티스레드 환경에서 “동시에 실행되면 안 되는 코드”를 어디까지, 어떻게 보호할 것인가는 동시성 설계의 핵심이다.이 글에서는 synchronized와 Lock이 무엇을 보장하고, 어디까지 책임지는지를 Java Memory Model과 공식 API 기준으로 정리한다.1. 배타성(Exclusivity)이 필요한 이유여러 스레드가 같은 데이터를 동시에 수정하면, 다음과 같은 문제가 발생한다.중간 상태가 노출된다불변식(invariant)이 깨진다연산 결과가 예측 불가능해진다이 문제를 해결하는 가장 직접적인 방법은 “한 번에 하나의 스레드만 실행하게 만드는 것” 이다.synchronized와 Lock은..