본문 바로가기
language/java

ReentrantLock 완벽 이해하기

by 죄니안죄니 2026. 6. 1.
반응형

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. 기능 비교

기능synchronizedReentrantLock
기본 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

항목synchronizedReentrantLock
자동 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이다.

반응형

댓글