이번주 위클리페이퍼 1
멀티스레드 환경에서 발생하는 대표적인 문제 중 하나인 경쟁 상태(Race Condition)에 대해 설명하고, 이를 해결하기 위한 다양한 전략을 설명하기
경쟁 상태(Race Condition)
두 개 이상의 스레드 또는 프로세스가 공유 자원에 동시에 접근하고 수정을 시도할 때 발생할 수 있는 문제
병행 프로그래밍 또는 동시성 프로그래밍 환경에서 발생하는 문제로써,
스레드 간의 실행 순서가 예상과 다를 경우 의도와는 다른 결과가 발생하며 프로그램의 정확성과 안정성을 저해하는 결과를 유발한다고 함
경쟁 상태가 발생하는 원인들
1. 동시성 접근 : 여러 스레드 또는 프로세스가 동시에 공유자원(변수, 파일, 데이터베이스)에 접근하려 할 때 발생함
2. 비원자성(Non-Atomic) 연산 : 공유 자원을 수정하는 연산이 원자적이지 않을 경우, 여러 단계로 나눠서 수행되는 경우에 발생할 수 있음, 트랜잭션이 아닐 경우 발생할 수 있을 것 같다
int number = 0;
// 스레드 1
number += 1;
// 스레드 2
number += 1;
만약에 스레드 1과 스레드 2가 동시에 number를 수정하려고 할 때, 경쟁 상태가 발생할 수 있다.
경쟁 상태가 발생하는 예시
1. 계좌 잔액 수정
여러 스레드에서 동시에 같은 계좌의 잔액을 수정하려고 할 때 경쟁 상태가 발생할 수 있다.
A가 50,000원을 인출하려고 할 때, 동시간대에 B가 30,000원을 입금하려고 한다면 잔액을 수정하는 순서에 따라서 잘못된 결과가 발생할 수 있다.
2. 캐시 데이터 갱신
여러 스레드가 동시에 캐시 데이터를 갱신하려고 할 때 경쟁 상태가 발생하여 캐시의 일관성이 깨질 수 있다고 한다.
3. 변수 카운터 변경
여러 스레드가 동시에 하나의 변수 카운터의 값을 증가시키려고 할 때 경쟁 상태가 발생할 수 있다.
위의 예제와 같이 하나의 값에 대해 여러 스레드가 동시에 값을 증감시킨다면 예기치 못한 결과가 발생할 수 있다고 한다.
경쟁 상태를 해결하는 방법들
1. 락(Lock) 사용 : 공유 자원에 접근할 때 락을 사용하여 스레드간에 동기화를 유지하고 경쟁 상태를 방지하기
2. 원자적 연산 사용 : 원자적 연산을 통해 공유 자원을 수정하는 동작을 원자적으로 수행하도록 하기 (트랜잭션)
3. Thread Safe 자료구조 사용 : ConcurrentHashMap, CopyOnWriteArrayList와 같은 다중 스레드 환경에서도 안전하게 데이터를 읽고 쓸 수 있는 자료구조를 사용하기. 이러한 자료구조들은 다중 스레드 환경에서 일관성과 안정성을 보장해준다고 함
4. 동기화 기술 사용 : 자바의 Synchronized 나 util.concurrent 패키지 등을 통해서 동기화 클래스 및 메서드를 활용하여 동시성 문제를 해결할 수 있다고 함.
출처 : https://turtledev.tistory.com/47
'위클리페이퍼' 카테고리의 다른 글
| 로컬 캐시와 분산 캐시의 개념, 장단점, 실무에 대해 (0) | 2025.10.20 |
|---|---|
| @Cacheable, @CachePut, @CacheEvict에 대해서 (0) | 2025.10.20 |
| OAuth 2.0의 주요 컴포넌트, Authorization Code Grant 흐름 (0) | 2025.09.22 |
| 세션 기반 인증과 토큰 기반 인증, 보안 고려사항 (0) | 2025.09.22 |
| AWS RDS의 장단점, EC2와의 차별점에 대해 (0) | 2025.08.26 |