반응형
Q. 동시성 문제란 무엇이며, 이를 해결하기 위한 기본적인 전략을 설명해주세요.
실제 운영 환경에 적용한 사례가 있다면 함께 설명해 주어도 좋습니다.
✅ 동시성 문제란?
동시성 문제(Concurrency Issue)란 여러 스레드가 동시에 동일한 자원에 접근하거나 수정하려고 할 때 발생하는 문제입니다.
멀티스레드 환경에서 자주 나타나며, 잘못된 동작이나 비정상 종료로 이어질 수 있습니다.
❗️대표적인 동시성 문제 유형
문제 | 유형 설명 |
Race Condition | 두 스레드가 동시에 자원에 접근하여 실행 순서에 따라 결과가 달라지는 현상 |
Deadlock | 서로의 자원을 기다리며 무한 대기하는 상태 |
Livelock | 서로 양보만 하다가 진전 없이 루프를 반복하는 상태 |
Starvation | 특정 스레드가 자원 접근 기회를 계속 박탈당하는 현상 |
🛠 동시성 문제 해결 전략
1. synchronized 키워드로 임계 구역 보호
public class Counter {
private int count = 0;
public synchronized void increment() {
count++; // 임계 구역
}
public int getCount() {
return count;
}
}
- synchronized 메서드 또는 블록을 사용해 한 번에 하나의 스레드만 접근 가능하도록 보장
2. ReentrantLock으로 명시적 락 제어
import java.util.concurrent.locks.ReentrantLock;
public class Counter {
private int count = 0;
private final ReentrantLock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
public int getCount() {
return count;
}
}
- 더 정밀한 락 제어가 필요할 때 유용 (예: 타임아웃, tryLock 등)
3. AtomicInteger로 원자적 연산
import java.util.concurrent.atomic.AtomicInteger;
public class Counter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
- 내부적으로 CAS(compare-and-swap) 알고리즘 기반으로 락 없이 스레드 안전한 연산 수행
4. 불변 객체(Immutable Object) 사용
public final class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
// Getter만 제공 (setter 없음)
}
- 객체를 변경 불가능하게 만들면 동시 접근 시에도 안전
- 변경 시에는 새 객체 생성 → 공유 자원 경쟁 없음
5. 동시성 컬렉션 사용 (ConcurrentHashMap, CopyOnWriteArrayList 등)
import java.util.concurrent.ConcurrentHashMap;
public class UserStore {
private ConcurrentHashMap<String, String> userMap = new ConcurrentHashMap<>();
public void addUser(String id, String name) {
userMap.put(id, name); // 스레드 안전
}
public String getUser(String id) {
return userMap.get(id);
}
}
- HashMap이나 ArrayList는 멀티스레드에서 위험 → Java에서 제공하는 동시성 컬렉션 사용 권장
📌 정리
전략 | 사용 도구 | 장점 |
임계 구역 보호 | synchronized | 간단한 락 처리 |
명시적 락 제어 | ReentrantLock | 유연하고 강력한 제어 |
원자 연산 | AtomicInteger 등 | 락 없이 성능 최적화 |
불변 객체 사용 | final, 생성자 초기화 | 공유 자원 없이 안전 |
동시성 컬렉션 | ConcurrentHashMap 등 | 자주 사용하는 자료구조 안전하게 사용 가능 |
반응형
'CS > TIL' 카테고리의 다른 글
[WEB] 브라우저 동작 방법 (0) | 2024.03.28 |
---|---|
[Database] Key (0) | 2024.03.26 |