← 질문 목록
#248깊이 0
멀티스레드 환경에서 스레드 세이프한 코드를 작성하는 방법은 무엇인가?
임계 영역에 동시에 들어가지 못하게 해 데이터 일관성을 지킨다. 잠금은 그중 한 가지 방법이다.
| 제어 방법 | 설명 |
|---|---|
| 동기화 | synchronized나 Lock으로 한 번에 하나만 들어가게 한다 |
| 불변성 | final과 읽기 전용 객체로 바뀔 일 자체를 없앤다 |
| 원자성 | Atomic 클래스로 읽고 고치는 것을 한 연산에 끝낸다 |
동기화·불변성·원자성은 공유 자원에 동시에 쓰는 경로를 줄이거나 없앤다. 읽고 쓰는 중간에 문맥이 바뀌면 값이 어긋난 채로 남을 수 있다.
락을 과하게 걸면 느려진다. 기다리는 스레드가 늘고 그만큼 전환 비용이 붙기 때문이다.
상황에 따라 CAS 같은 원자적 연산으로 락 없이 구현하기도 한다. 일관성은 지키면서 기다리는 비용을 피하는 길이다.
추천 꼬리질문
관련 질문
- 데드락은 어떤 조건이 모두 모여야 생기는가?운영체제스레드 세이프한 코드를 작성하기 위한 상호 배제(Mutual Exclusion) 전략이 데드락 발생의 필수 조건 중 하나이다.
- 데드락을 해결하기 위한 회피 전략은 무엇인가?운영체제스레드 세이프한 코드를 작성하기 위해 사용하는 동기화 메커니즘이 데드락을 유발할 수 있으므로, 두 개념 모두 동기화 문제를 다룬다.
- 동기화 문제를 하드웨어적으로 어떻게 해결하는가?운영체제하드웨어적 동기화 해결책(TSS 등)은 멀티스레드 환경에서 스레드 세이프한 코드를 구현하는 하위 메커니즘으로 사용된다.
- 프로세스와 스레드의 핵심 차이는 무엇인가?운영체제멀티스레드 환경에서의 스레드 세이프티를 이해하려면, 먼저 스레드가 공유하는 자원과 프로세스와의 차이를 이해해야 한다.
- 공유 자료구조를 Thread-Safe하게 만드는 방법은 무엇인가?자료구조 · 알고리즘