패스잇
CS 기초 · 심화

Java의 synchronized 키워드와 ReentrantLock 클래스의 내부 구현 메커니즘을 비교하고, 특히 ReentrantLock이 synchronized보다 제공하는 유연성과 고급 기능(예: 조건 변수, 공정성)이 어떻게 구현되는지 AQS(AbstractQueuedSynchronizer)를 중심으로 설명해 주십시오.

힌트 · synchronized는 JVM 모니터 기반이며 AQS를 사용하지 않습니다. ReentrantLock은 AQS를 기반으로 락 획득/해제 로직을 구현하며, CAS를 이용한 상태 관리와 대기 큐를 통해 조건 변수 및 공정성 모드를 제공합니다.

synchronizedReentrantLockAQS조건 변수공정성

모범답안

synchronized와 ReentrantLock은 모두 스레드 동기화를 위한 도구지만, 내부 구현 방식과 제공하는 기능에 차이가 있습니다.

synchronized는 JVM의 모니터(monitor) 메커니즘을 기반으로 동작합니다. 각 객체는 모니터 락을 가지며, synchronized 블록이나 메소드에 진입하면 해당 객체의 모니터 락을 획득합니다. 락 획득 및 해제는 JVM 레벨에서 관리되며, 별도의 대기 큐나 조건 변수 기능을 직접적으로 제공하지 않습니다.

반면 ReentrantLock은 java.util.concurrent.locks.AbstractQueuedSynchronizer (AQS)를 기반으로 구현됩니다. AQS는 스레드 동기화를 위한 프레임워크로, CAS(Compare-And-Swap) 연산을 이용해 상태를 관리하고, 공정성(fairness) 모드와 조건 변수(Condition)를 지원합니다.

ReentrantLock의 유연성은 AQS 덕분입니다. AQS는 스레드들이 락을 획득하기 위해 대기하는 큐를 관리하며, 이를 통해 조건 변수(Condition)를 구현합니다. newCondition() 메소드로 생성된 Condition 객체는 await()와 signal()/signalAll() 메소드를 통해 스레드를 특정 조건에서 대기시키거나 깨울 수 있습니다. 또한, ReentrantLock은 생성자에서 fair=true 옵션을 통해 공정성 모드를 지원하는데, 이는 AQS가 대기 큐의 순서대로 락을 할당하도록 하여 모든 스레드가 락을 획득할 기회를 공평하게 갖도록 합니다.

요약하자면, synchronized는 JVM 레벨의 간편한 동기화 도구이고, ReentrantLock은 AQS를 통해 더 세밀한 제어와 고급 기능(조건 변수, 공정성)을 제공하는 강력한 동기화 도구입니다.

읽었다면, 이제 직접 답해볼 차례예요

패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.

함께 보는 동시성 / 멀티스레딩 면접 질문

← 동시성 / 멀티스레딩 면접 질문 전체 보기