← 질문 목록
#184깊이 0
volatile 키워드는 가시성 문제를 어떻게 해결하는가?
메인 메모리에서 직접 읽고 쓰게 하여 모든 스레드가 최신 값을 보게 한다. 캐시를 건너뛰어서가 아니다. 메모리 모델이 정한 가시성과 순서를 지키도록 강제하고, 그것을 메모리 장벽과 캐시 일관성 장치가 받쳐 준다.
- 스레드 AL1/L2 캐시. 지역적으로 값을 복사해 사용한다
- 메인 메모리공유 영역. volatile 변수가 저장되는 곳
- 스레드 BL1/L2 캐시. 메모리에서 직접 읽어 최신값을 얻는다
CPU는 성능을 위해 값을 캐시에 복사해 쓴다. 여러 스레드가 같은 변수를 수정할 때 각자 캐시만 보면 다른 값을 가지게 된다.
volatile은 읽기/쓰기 시점에 메모리 장벽을 세운다. 이렇게 해서 자바 메모리 모델이 정한 가시성과 순서를 지킨다. 캐시를 실제로 어떻게 다룰지는 JVM과 CPU가 알아서 한다.
다만 원자성은 보장하지 않는다. count++ 같은 연산은 읽기, 수정, 쓰기 세 단계로 나뉘어 여전히 데이터 경쟁이 발생한다.
추천 꼬리질문
관련 질문
- 상태 변경을 막으면 동시성에서 무엇을 얻는가?언어 · 런타임volatile을 통한 가시성 확보와 불변성을 통한 상태 변경 방지는 모두 멀티스레드 환경의 동시성 제어 방법이다.
- volatile은 무엇을 보장하고 놓치는가?언어 · 런타임두 질문 모두 volatile 키워드의 동작 보장 범위와 메모리 가시성 문제를 다룹니다.
- 동기화 문제를 하드웨어적으로 어떻게 해결하는가?운영체제volatile의 가시성 해결 원리는 CPU 캐시와 메인 메모리 간의 동기화라는 하드웨어적 메커니즘과 밀접하게 연관되어 있다.
- 가상 메모리는 무엇을 해결하는가?운영체제
- 폰트 표시 지연과 깜빡임을 어떻게 줄이는가?프론트엔드