-
`@Volatile` 이해하기프로그래밍 언어/Kotlin 2025. 12. 31. 16:05
@Volatile private var something: Something동료분이 해당 코드에 리뷰를 해주었다.
@Volatile 은 ThreadLocal 에 저장하는 키워드로 알고 있는데, Webflux + 코루틴 환경에서 문제가 없을까요?@Volatile 은 CPU 캐시가 아닌 메인 메모리를 보게하는 명령어라고만 알고 있었다.
문제가 없어보이지만 혹시 내가 아는게 다르지 않을까 싶어 여러 문서를 뒤져보고 알게 된 지식을 정리하고자 한다.
# Volatile
- CPU 캐시는 ThreadLocal(JVM Heap 에 저장되는 자료구조) 에 저장되는 값이 아닌 OS 의 CPU Core 에 저장되는 캐시이다.
- @Volatile 키워드는 메모리 모델 상의 happens-before 관계만 정의한다. 즉, JVM 이 어떻게 이를 구현할지는 자유이다.
이때 말하는 메모리는 Java Thread 의 ThreadLocal 이 아닌 JMM 을 뜻한다.
@Volatile 에 관해 CPU 캐시가 아닌 메인 메모리를 보게한다는 설명은 교육적 예시일 뿐이다.
결론적으로 @Volatile 은 JMM 규칙(visibility/ordering 를 보장)이며, JVM이 이를 지키기 위해 메모리 장벽 같은 기법으로 보장한다. 어떤 방식으로 보장할 것인지는 제한하지 않고 있다. 실제 캐시/메모리 동작은 JVM 구현과 CPU 아키텍처에 의존한다.
# Volatile 이 보장하는 것
1. visibility
- 한 스레드가 값을 쓰면 다른 스레드가 항상 최신 값을 보게 한다.
2. ordering
- 이전의 모든 쓰기가 이후의 모든 읽기보다 먼저 보임
# @Volatile vs ThreadLocal
구분 @Volatile ThreadLocal 공유 여부 공유됨 스레드별 가시성 보장 의미 없음 스레드 이동 안전 깨짐 WebFlux 사용 가능 위험 728x90'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
[Kotlin] Runtime 에 타입정보를 알아내는 방법 (0) 2023.05.15 [Kotlin] 객체 데이터 암호화 하기 (0) 2023.05.08 [Kotlin] static nested Class, inner Class 문법 정리 (0) 2022.11.06 [Kotlin] 코틀린에서 JPA Lazy Loading 적용하기 (0) 2022.09.25 [Kotlin] 코틀린 문법 요약 (자바코드로 훑어보기) (0) 2022.09.19