Volatile 이란 c++ , Java, Kotlin에서 메모리 가시성을 위한 키워드 이다 . ( 다른 언어는 안써봐서 잘 모르겠다 .. )
멀티 스레드 환경에서 특정 공유 메모리 리소스에 접근하여 해당 값을 사용할떄
각 스레드는 해당값을 cpu 캐시 메모리에 저장하여 사용 한다.
스레드 A에서 공유 메모리에 접근하여 해당값을 0에서 1로 변경 했을때
해당값을 A 스레드의 cpu 캐시 메모리상에서 변경된 것이지 메인 메모리에 적용이 된것이 아니기때문에
B스레드는 여전이 0이라는 값을 읽게 된다.
이렇게 A에서 변경한 공유 메모리 값을 B에서 언제 확인 할지 모르는 문제를 "가시성" 문제라고 한다.
해당 문제를 해결하기 위해서 공유 메모리 변수 앞에 volatile이라는 키워드를 붙여 사용하게 되는데
해당 키워드는 cpu 캐시 메모리와 메인 메모리간의 동기화를 보장해서 메인메모리에 바로 접근하는것 처럼 동작하게 된다.
예전에 안드로이드 레거시 프로젝트 리팩터링을 한적이 있었는데.
모든 동작이 짬뽕된 포그라운드 서비스가 구현 되어 있었고 (서비스에서 UiThread에 직접 접근해서 동작 하는등.. 복잡해게도 짜놨었다 ㅎ)
메인 스레드와 포그라운드 서비스에서 동작하는 스레드 사이에 공유 메모리 volatile 변수로 값을 공유한 코드를 본적이 있었는데 갑자기 생각나서 정리해 봤다.
매 순간 개발 할때마다 유지보수를 염려에 두고, 관심사 분리나 의존성등을 더 신경 써서 개발 해야겠다 라는 생각이 든다.
어짜피 내가 유지보수 해야하니 말이다.