캐싱을 해야하는 새로운 기능을 개발하는 작업중에 만난 누군가가 작성한 아래의 코드를 보면
volatitle이라는 키워드로 선언한 변수가 있다.
volatitle이 뜻하는 바는 무엇인가?
이는 자바 코드의 변수를 '메인 메모리에 저장'할 것을 명시할 때 사용된다. 멀티 쓰래드 어플리케이션에서 각 쓰래드들은 성능적이 이유로 메인 메모리로 부터 변수를 읽어 CPU 캐시에 복사하고 작업하게 되는데 이 키워드를 명시한 변수는 컴퓨터의 메인 메모리로 부터 읽히고 변수에 대한 쓰기 작업은 메인 메모리로 직접 이루어진다.
volatile를 선언하지 않은 변수들은 어느 시점에 JVM이 메인 메모리로 부터 데이터를 읽어 CPU 캐시로 읽어 들이거나 혹은 CPU 캐시들에서 메인 메모리로 데이터를 쓰는지(write) 보장해 줄 수 없다. 그렇게되면 변수의 값이 Main Memory에서 변경이 되어도 멀티쓰레드에서 사용중인 cache값과 달라 정합성이 깨지는 경우가 있게 된다.
필자가 담당중인 프로젝트에서 volatile을 명시한 변수는 상담가능시간, 자동인사여부 등 공통 환경변수들을 담는 map에 명시하였다. 즉 공유변수이기 때문에 어떠한 쓰레드에서도 데이터가 일치해야하므로 volatitle을 명시한 것이다!
volatile 변수에 대한 읽기와 쓰기는 변수를 메인 메모리로 부터 읽거나 쓴다. 하지만 메인 메모리에 읽고 쓰는것은 CPU 캐시보다 더 cost가 비싸다고 할 수 있다. 또한 volatile 변수는 성능을 개선 기법인 명령(instruction)들의 재배치를 방지하기 때문에 변수의 가시성을 강제할 필요가 있는 경우에만 volatile 변수를 사용하는 것이 좋다.
'개발 > Java & Kotlin' 카테고리의 다른 글
내가 보려고 쓰는 Java와 Kotlin 차이 정리 #3 (0) | 2024.10.25 |
---|---|
내가 보려고 쓰는 Java와 Kotlin 차이 정리 #2 (1) | 2024.10.16 |
내가 보려고 쓰는 Java와 Kotlin 차이 정리 #1 (0) | 2024.10.10 |
OPEN JDK 1.8 윈도우 설치 방법 (0) | 2020.06.16 |
web.xml에 welcome-file 설정하는 방법 (0) | 2019.04.08 |