반응형
Synchronized
Synchronized란 현재 데이터를 사용하고 있는 해당 스레드를 제외하고 나머지 스레드들은 데이터에 접근할 수 없도록 막기 위해 사용하는 키워드입니다.
Synchronized 특징
- 스레드가 Synchronized 키워드가 붙은 메서드에 진입하려면 해당 객체의 락을 획득해야합니다.
- 락을 획득하지 못한 스레드는 RUNNABLE 상태에서 BLOCKED 상태로 전환됩니다. 락을 획득할 때까지 대기하며, 이 동안 CPU 실행 스케줄링에서 지외됩니다.
- 여러 스레드가 대기 중일 경우, 락 획득 순서는 보장되지 않습니다.
- Synchronized 블록 안에서는 변수의 메모리 가시성 문제가 자동으로 해결되므로 별도의 volatile 선언이 필요하지 않습니다.
Synchronized의 단점
BLOCKED 상태의 스레드는 락이 풀릴 때까지 대기하며 Synchronized는 인터럽트, 타임아웃을 지원하지 않습니다. 다만, wait()을 통해 BLOCKED 상태인 스레드를 WAITING으로 변경하고 해당 스레드를 인터럽트 시킬 수는 있습니다.
BLOCKED 상태의 여러 스레드 중에 어떤 스레드가 락을 획득할지 순서 및 공정성을 보장하지 않습니다.
ReentrantLock
ReentrantLock는 특정 구문에 대한 Lock을 관리하기 위한 클래스입니다.
ReentrantLock의 특징
무한 대기 현상 극복
LockSupport를 활용하여 스레드가 락을 획득하려고 대기할 때, 스레드의 상태를 BLOCKED 대신 WAITING으로 변경해서 인터럽트를 허용하게 해줍니다.
공정성 극복
ReetrantLock은 공정 모드와 비공정 모드를 제공해 필요에 따라 선택할 수 있습니다.
공정 모드
- 대기 큐에 있는 스레드가 락을 요청한 순서대로 락을 획득합니다.
- 모든 스레드가 언젠가는 락을 획득할 수 있습니다.
- 대기 큐 관리로 인해 성능이 저하될 수 있습니다.
비공정 모드
- 성능을 중시하는 환경에서 사용됩니다.
- 비공정 모드이지만, ReetrantLock은 내부적으로 큐를 바탕으로 구현되어 있기 때문에 스레드 간 경합이 크지 않은 이상 순서대로 처리됩니다.
Synchronized와 ReentrantLock의 차이
| 항목 | Synchronized | ReetrantLock |
|---|---|---|
| 스레드 대기 상태 | BLOCKED | WAITING 혹은 TIMED_WAITNG으로 인터럽트를 통해 대기를 중단시킬 수 있음 |
| 효율성 | 대기 집합(wait set, wait())에서 원하는 스레드만 선택적으로 깨울 수 (notify) 없음 | Condition 객체를 활용하며 원하는 스레드만 선택적으로 깨울 수 있음 |
반응형
'Java' 카테고리의 다른 글
| Java 23 (0) | 2026.05.06 |
|---|---|
| Java에서 데이터 없음을 표현하는 방법 (0) | 2026.04.18 |
| ThreadLocal (0) | 2020.05.26 |
| Java 예외 처리 (0) | 2020.04.25 |
| .map()과 .flatMap()의 차이 (0) | 2020.04.10 |