Java
자바에서 volatile 이란?
Bepoz
2020. 9. 4. 01:01
volatile 키워드를 변수앞에 쓴다는 것은 변수를 읽어들이거나 받아들일 때에
main memory에서 읽어들이고 main memory에 저장하겠다는 뜻을 갖는다.
다음과 같은 멀티 스레드 상황에서
CPU1이 Main Memory에 있는 value 값을 가져와서 +1씩 시키고 있을 때에
CPU2가 Main Memory에서 뒤늦게 value 값을 가져와서 사용할 때에 서로의 변수 값이 다르기에 오류가 발생할 수 있다.
이 때에 volatile 키워드를 사용해서 변수 앞에 붙여주면 위의 변수 값이 일치하지 않아서 생기는 오류를 해결할 수 있다.
하지만 언제나 적절한 것은 아니다. 흔한 멀티스레딩 문제의 오류가 날 수 있기 때문이다.
만약 CPU1이 Main Memory에서 부터 0의 값을 가진 count 변수를 가져와 +1를 해주고 write를 해주기 전에
CPU2가 count 변수를 가져와 +1를 해주고 write을 하려는 상황에서 기댓값은 2이지만 1이 write 될 것이다.
그렇기 때문에 이런 여러 스레드가 write 하게 되는 상황에서는 synchronized 키워드를 이용해 꼭 동기화 해주어야 한다.
Main Memory가 Cache Memory보다 비용값이 크기 때문에 위의 상황과 같은 변수 값 일치를 기대해야 할 때에만
volatile를 사용하는 것이 좋다.