ReentrantLock 완벽 이해하기
이전 글에서 synchronized를 배웠다.
많은 사람들이 생각한다.
동기화 = synchronized
하지만 실무에서는 종종:
ReentrantLock
을 사용한다.
왜냐하면 synchronized가 제공하지 않는 기능들이 있기 때문이다.
면접에서도 자주 나오는 질문:
synchronized와 ReentrantLock 차이는?
1. ReentrantLock이란?
ReentrantLock
한 줄 정의.
synchronized를 객체로 구현한 고급 Lock
2. synchronized 방식
public synchronized void increase() {
count++;
}
JVM이 자동으로:
Lock 획득
↓
실행
↓
Lock 해제
처리.
3. ReentrantLock 방식
private final ReentrantLock lock =
new ReentrantLock();
public void increase() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
4. 왜 finally가 중요할까?
잘못된 코드.
lock.lock();
count++;
return;
예외 발생 시.
unlock() 실행 안됨
결과.
영원히 Lock 보유
데드락 발생 가능.
5. 실무 필수 패턴
lock.lock();
try {
...
} finally {
lock.unlock();
}
무조건 암기.
6. 이름의 의미
Reentrant
재진입 가능
Lock
잠금
7. 재진입 가능이란?
예:
public void a() {
lock.lock();
try {
b();
} finally {
lock.unlock();
}
}
public void b() {
lock.lock();
try {
} finally {
lock.unlock();
}
}
8. 문제 없어?
있어 보인다.
a()
Lock 획득
b()
같은 Lock 재획득
보통 Lock이면 데드락.
9. ReentrantLock
같은 Thread라면 허용.
내부적으로
Owner Thread
Hold Count
관리.
예:
Thread A
lock()
count=1
↓
lock()
count=2
unlock 두 번 해야 해제.
10. synchronized도 재진입 가능
사실.
synchronized
도 재진입 가능.
그래서
synchronized a()
안에서
synchronized b()
호출 가능.
11. 그럼 차이가 뭘까?
진짜 중요한 부분.
12. 기능 비교
| 기본 Lock | O | O |
| 재진입 | O | O |
| tryLock | X | O |
| Interrupt 가능 | X | O |
| 공정성(Fairness) | X | O |
| Condition | X | O |
| 자동 해제 | O | X |
13. tryLock()
면접 단골.
synchronized.
Lock 없으면
무조건 대기
ReentrantLock.
if(lock.tryLock()) {
}
14. 의미
Lock 있으면 획득
없으면 즉시 실패
15. 예제
if(lock.tryLock()) {
try {
process();
} finally {
lock.unlock();
}
} else {
System.out.println("실패");
}
16. 장점
Thread가 멈추지 않음.
대기 없음
17. timeout 지원
실무 중요.
lock.tryLock(
3,
TimeUnit.SECONDS
);
의미.
최대 3초 대기
안되면 실패
18. synchronized는?
불가능.
무조건 기다림.
19. lockInterruptibly()
고급 기능.
lock.lockInterruptibly();
20. 의미
대기 중 인터럽트 가능.
예:
Lock 대기
중
thread.interrupt()
호출.
즉시 종료 가능.
21. synchronized는?
Lock 대기 중
이면
인터럽트 불가.
22. Fair Lock
면접 단골.
기본 ReentrantLock.
new ReentrantLock();
비공정.
23. 의미
먼저 기다린 Thread
가
반드시 먼저 실행 아님.
24. Fair Lock 생성
new ReentrantLock(true);
25. 의미
FIFO
순서 보장.
26. 예
Thread A 대기
Thread B 대기
Thread C 대기
획득 순서.
A
↓
B
↓
C
27. 왜 기본이 false?
공정성은 성능 저하.
Thread 재스케줄링 증가.
실무 대부분.
new ReentrantLock()
사용.
28. Condition 등장
매우 중요.
synchronized에서.
wait()
notify()
notifyAll()
사용.
복잡함.
29. ReentrantLock
Condition condition =
lock.newCondition();
30. 대기
condition.await();
31. 깨우기
condition.signal();
32. 전부 깨우기
condition.signalAll();
33. Producer Consumer
실무 대표 사용 사례.
생산자
↓
Queue
↓
소비자
Condition으로 제어 가능.
34. 내부 구조
ReentrantLock은
AQS
기반.
35. AQS란?
AbstractQueuedSynchronizer
한 줄 정의.
Java 동기화 프레임워크의 핵심
36. 내부
state 변수
+
대기 Queue
관리.
37. Lock 획득
CAS 시도.
성공
↓
진입
실패.
대기 Queue 등록
38. synchronized와 차이
synchronized
JVM Monitor
기반.
ReentrantLock
AQS + CAS
기반.
39. 언제 synchronized 사용?
실무 기준.
단순한 경우.
synchronized
추천.
코드 간결.
JDK 최적화 잘 되어 있음.
40. 언제 ReentrantLock 사용?
대표.
tryLock 필요
timeout 필요
공정성 필요
Condition 필요
41. 실무 예시
캐시 갱신.
if(lock.tryLock()) {
refreshCache();
}
이미 누군가 갱신 중이면.
그냥 스킵
가능.
42. 면접 단골 질문
Q. ReentrantLock이란?
재진입 가능한 Lock 구현체
Q. synchronized와 차이는?
tryLock
timeout
interrupt
fairness
condition
지원.
Q. tryLock 장점은?
대기하지 않고 즉시 실패 가능
Q. Fair Lock이란?
FIFO 순서 보장
Q. 내부 구현은?
AQS + CAS
43. synchronized vs ReentrantLock
| 자동 unlock | O | X |
| tryLock | X | O |
| timeout | X | O |
| interrupt | X | O |
| fairness | X | O |
| condition | X | O |
| 사용 편의성 | 높음 | 보통 |
44. 핵심 흐름 요약
lock()
↓
CAS 시도
↓
성공 → 실행
실패 → AQS Queue 대기
↓
unlock()
↓
다음 Thread 깨움
45. 가장 중요한 핵심 한 줄
ReentrantLock은 synchronized보다 더 많은 제어 기능(tryLock, timeout, fairness, Condition)을 제공하는 재진입 가능한 Lock 구현체이며, 내부적으로 AQS와 CAS를 기반으로 동작한다.
46. 다음 글 예고
다음 글은:
DeadLock 원인과 해결
이다.
여기서:
교착상태(DeadLock)
발생 조건 4가지
실제 코드 예제
예방 기법
ReentrantLock.tryLock() 활용
까지 배우게 된다.
실무 장애 분석에서 가장 무서운 동시성 문제가 바로 DeadLock이다.
'language > java' 카테고리의 다른 글
| ConcurrentHashMap 동시성 처리 완벽 이해하기 (0) | 2026.06.01 |
|---|---|
| DeadLock(교착상태) 원인과 해결 완벽 이해하기 (0) | 2026.06.01 |
| ForkJoinPool 완벽 이해하기 (0) | 2026.06.01 |
| CompletableFuture 완벽 이해하기 (0) | 2026.06.01 |
| ThreadPool 구조 완벽 이해하기 (0) | 2026.06.01 |
댓글