멀티스레드에서 어떤 스레드에서 힙 메모리에 있는 값을 변경했다고 다른 스레드에서 바로 그 값이 보이는 것이 아니다.
여러 코어가 있는 CPU의 경우 각 스레드가 캐시 메모리를 가지고 있다면 메인 스레드 변경이전에 캐시메모리에 변경한다.
만약 다른 스레드에서 힙 메모리의 값에 대해 while문을 돌고 있었다면 그 스레드는 자신의 캐시 메모리를 확인하기 때문에 영원히 while문이 끝나지 않을 수 있다.
보통 컨텍스트 스위칭 할 때 캐시 메모리를 비우기 때문에 메인메모리에 쓰고 캐시메모리에 옮겨쓰는게 일어나지만 컨텍스트 스위칭에서 무조건 반영된다고 확신할 수 없다.
자바의 volatile는 캐시 메모리가 아닌 메인 메모리에 직접 쓰고 조회하라는 명령어이다.
캐시 메모리를 사용하는 것보다 성능이 느려진다. 대략 5배정도 느려지고 얼마나 느려지는거는 캐시메모리 사양에 따라다르지만 대부분 2배이상은 느려짐
'Java > JVM' 카테고리의 다른 글
| JVM (0) | 2026.02.08 |
|---|---|
| 자바 메모리 모델 (JMM) (0) | 2026.02.02 |
| 스레드 로컬 (0) | 2026.01.23 |
| 리플렉션 (0) | 2026.01.22 |
| 자바의 컴파일, 클래스 로딩, 실행 구조 정리 (0) | 2026.01.03 |