티스토리 뷰
동시성 제어(Concurrency Control)
여러 프로세스나 스레드가 동시에 동일한 자원에 접근할 때 발생할 수 있는 충돌이나 데이터 일관성 문제를 방지하기 위한 기법이다. 다수의 스레드가 한 자원(변수, 데이터베이스, 파일 등)에 동시 접근하면 예상치 못한 결과가 발생할 수 있다.
스프링에서 동시성 제어 방법
ReentrantLock은 자바의 Lock 인터페이스를 구현한 클래스 중 하나로 동시성 제어할 수 있는 도구이다.
주요 특징
1. 재진입 가능( Reentrant)
동일한 스레드가 여러 번 연속해서 lock을 획득할 수 있는 기능을 제공한다. 예를 들어, 한 스레드가 이미 lock를 가지고 있을 때, 스레드가 같은 lock을 다시 요청해도 블로킹되지 않고 바로 접근할 수 있다.
2. 공정성 설정 가능 (Fairness)
ReentrantLock은 lock을 획득하는 순서를 제어할 수 있다. 기본적으로는 비공정 모드로 동작하지만, 생성자에서 ReentrantLock(true)로 설정하면 공정 모드가 된다. 공정 모드에서는 먼저 lock을 요청한 스레드가 우선적으로 lock을 획득하도록 보장한다.
※ 공정성: 여러 스레드가 lock을 요청할 때, 먼저 요청한 순서대로 lock을 획득해 기아 현상 없이 동시성 제어를 보장
※ 기아 현상: 특정 스레드가 자원에 대한 접근 기회를 계속해서 얻지 못하고 무한 대기 상태에 빠지는 문제를 말한다.
3. 명시적인 lock 해제
synchronized는 코드 블록이 끝나면 자동으로 lock이 해제되지만, ReentrantLock은 반드시 unlock()을 명시적으로 호출해야 lock이 해제된다. lock해제 시점을 좀 더 세밀하게 제어할 수 있지만, 실수로 unlock()을 호출하지 않으면 deadlock이 발생할 수 있다.
※ Deadlock: 두 개 이상의 프로세스나 스레드가 서로 상대방이 점유하고 있는 자원을 기다리느라, 영원히 진행되지 못하는 상태
4. tryLock()
tryLock() 메서드를 사용하면 특정 시간 동안만 lock을 시도하고, 실패 시 다른 동작을 하도록 구현할 수 있다. 이 기능은 자원이 이미 lock 되어 있을 때 대기하지 않고 다른 작업을 처리할 수 있도록 유연성을 제공한다.
5. Condition 객체와 연계
ReentrantLock은 Condition 객체와 함께 사용되어, 보다 복잡한 동기화 조건을 처리할 수 있다.
※ Condition: 대기 상태와 신호 전달을 관리하는 도구로, 여러 스레드가 동기화된 방식으로 특정 조건을 기다리거나 알림을 받을 수 있다.
ReentrantLock lock = new ReentrantLock(true); // 공정한 lock 생성
lock.lock(); // lock 획득
try {
// 동시성 제어가 필요한 코드
} finally {
lock.unlock(); // 반드시 unlock을 호출하여 lock 해제
}
ReentrantLock은 동시성 제어가 필요한 복잡한 환경에서 synchronized보다 더 유연한 대안으로 자주 사용한다.
끝.
'Spring' 카테고리의 다른 글
IntelliJ IDEA CE에서 Spring Boot 프로젝트 실행 오류 해결 (0) | 2025.01.08 |
---|---|
[Spring] 단위 테스트 (Unit Test) (0) | 2024.09.08 |
[Spring] 단위 테스트(Unit Test)와 테스트 주도 개발(TDD)의 중요성 (0) | 2024.09.06 |
[Spring] HTTP GET과 POST 개념과 차이점 (0) | 2024.08.12 |
[Spring] Http Method 란 (0) | 2024.07.21 |
- Total
- Today
- Yesterday
- bool
- Python
- counter
- Lambda
- If
- isalpha
- Upper
- Method
- function
- index
- combinations
- for
- Lower
- permutations
- find
- operators
- Built-in Functions
- isdigit
- zip
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |