본문 바로가기
Programming/JAVA

volatile

by 유주원 2012. 12. 27.

얼핏보면 C volatile과 다른 문맥으로 쓰인 것 처럼 보였지만 알고 보면 같은 의미이다.

첫번째로 C에서 volatile 선언은 optimize를 포기하겠다는 의미로 표현될 수 있다.

가령 어떤 변수에 

i = 0;

i = 10;

i = 20;

i = 50;

이라는 값을 대입했을 경우 volatile로 선언하지 않았을 경우, C 컴파일러에서는 optimize를 위해서 최종 50에 해당하는 값만 의미가 있다고 판단을 하고 나머지 0,10,20에 대한 값은 누락시킬 것이다.

하지만 이를 방지하고 단계적 순차과정을 알아야 한다면 volatile로 선언을 해주어야 한다.


두 번째는 멀티쓰레드 환경에서의 무결성 보장을 위한 측면으로 사용될 수 있다.

프로그램은 메모리에 대입한 변수에 대해 매번 메모리로부터 값을 가지고 오는 것이 아니라, 한 번 가져온 후 이후엔 레지스터에 남아 있는 값을 가져오게 된다. 하지만 그 사이 다른 쓰레드에서 해당 메모리 값을 변경시켰다면 레지스터의 값과 메모리에 값이 서로 달라 잘못된 값을 연산하게 될 것이다.


위의 코드에서 longValue 선언 시 volatile을 선언해 주지 않는다면 값이 달라지는 것을 확인해 볼 수 있다.

이유는 각각의 쓰레드에서 longValue 접근 시, 레지스터 값을 가져오기 때문에 그 차이 값이 발생하는 것이다.

때문에 멀티쓰레드 환경에서 공유 변수 사용시에는 항상 volatile을 써주는 것이 좋다.