Java의 synchronized 키워드와 ReentrantLock 클래스의 내부 구현 메커니즘을 비교하고, 특히 ReentrantLock이 synchronized보다 제공하는 유연성과 고급 기능(예: 조건 변수, 공정성)이 어떻게 구현되는지 AQS(AbstractQueuedSynchronizer)를 중심으로 설명해 주십시오.
힌트 · synchronized는 JVM 모니터 기반이며 AQS를 사용하지 않습니다. ReentrantLock은 AQS를 기반으로 락 획득/해제 로직을 구현하며, CAS를 이용한 상태 관리와 대기 큐를 통해 조건 변수 및 공정성 모드를 제공합니다.
모범답안
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 코칭합니다.
함께 보는 동시성 / 멀티스레딩 면접 질문
- 락(Lock)을 사용하지 않고 스레드 안전한(thread-safe) 큐를 구현한다고 가정할 때, 어떤 기법들을 활용할 수 있으며, 특히 CAS(Compare-And-Swap) 연산을 사용하여 어떻게 원자성(atomicity)을 보장할 수 있는지 구체적인 예시와 함께 설명해 주십시오. 락 프리(lock-free) 방식의 장단점은 무엇입니까?
- 멀티스레드 환경에서 캐시 일관성(cache coherence)과 관련된 문제 중 'False Sharing'이 무엇인지 설명하고, 이로 인해 발생하는 성능 저하 문제를 어떻게 진단하고 해결할 수 있는지 구체적인 방안을 제시해 주십시오.
- 분산 시스템 또는 복잡한 마이크로서비스 환경에서 발생할 수 있는 교착 상태(deadlock)를 예방하거나 탐지하기 위한 고급 전략에는 어떤 것들이 있으며, 각 전략의 구현 복잡도와 실제 적용 시의 고려사항은 무엇인지 설명해 주십시오.
- 멀티코어 환경에서 동시성 애플리케이션의 성능을 논할 때, 확장성(scalability)과 처리량(throughput)은 어떤 관계를 가지며, 특정 워크로드에서 이 두 가지 지표를 최대화하기 위한 동시성 설계 전략은 어떻게 달라져야 하는지 구체적인 사례를 들어 설명해 주십시오.
- 기존 스레드 기반의 동시성 모델(shared-memory concurrency)과 비동기 프로그래밍 모델(예: Actor Model, CSP)을 비교하고, 각각의 모델이 특정 유형의 문제(I/O 바운드 vs. CPU 바운드)에 어떻게 더 적합한지, 그리고 발생할 수 있는 트레이드오프(trade-off)는 무엇인지 설명해 주십시오.