← 질문 목록
#73깊이 0
volatile은 무엇을 보장하고 놓치는가?
volatile 쓰기는 뒤따르는 같은 변수의 읽기보다 먼저 일어난다. 해당 접근을 경계로 가시성과 재정렬 제약을 제공하지만 복합 연산은 원자화하지 않는다.
| 기준 | volatile | synchronized |
|---|---|---|
| 가시성·순서 | 보장한다 | 보장한다 |
| 복합 연산 원자성 | 보장하지 않는다 | 같은 모니터로 보호할 때 보장한다 |
한 스레드가 volatile 변수에 쓰기 전에 수행한 일반 쓰기도 그 값을 읽은 스레드에 보인다. 이 happens-before 관계가 다른 상태의 전달까지 만든다.
단순 상태 플래그와 완전히 생성된 객체 참조의 게시에는 적합하다. 이중 확인 잠금의 인스턴스 참조에도 필요하다.
count++는 읽기, 계산, 쓰기의 세 단계라 volatile이어도 갱신을 잃을 수 있다. 경쟁 갱신에는 AtomicInteger나 잠금이 필요하다.