volatile 이란?
private static volatile boolean x;
Plain Text
복사
•
volatile keyword는 Java 변수를 Main Memory에 저장하겠다라는 것을 명시하는 것
•
매번 변수의 값을 Read할 때마다 CPU cache에 저장된 값이 아닌 Main Memory에서 읽는 것
•
또한 변수의 값을 Write할 때마다 Main Memory에 까지 작성하는 것
이런 상황에서, 이 키워드를 사용하면 캐시 때문에 동기화가 이뤄지지 않는 문제를 해결 할 수 있다.
volatile 활용 방법
Multi Thread 환경에서 하나의 Thread만 read & write하고 나머지 Thread가 read하는 상황에서 가장 최신의 값을 보장 해준다.
따라서 여러 스레드에서 write가 가능한 상황에서는 적합하지 않다.
(하나의 Thread에서만 write하더라도, 그 변수(메모리)에 대한 접근과 수정이 잦다면 다른 스레드에서 read할때 원자성이 보장되지 않는다.)
JavaScript
복사
스레드마다 write할 수 있는 상황에서는 Main에서 변수의 값을 불러 오더라도,
연산 후 Main에 반영되기 전 cache 단계에서 각 변수의 값이 존재 하게 되고, 결국 main에는 counter = 1이 저장된다.
따라서 synchronized / concurrent패키지의 atomic클래스를 이용 을 통해 변수 read & write의 원자성(atomic)을 보장해 주는것이 선행되어야 한다.
정리
volatile 키워드를 사용하여 CPU메모리 영역에 캐싱된 값이 아니라 항상 최신의 값을 가지도록 메인 메모리 영역에서 값을 참조하게 해서 동일 시점에 모든 스레드가 동일한 값을 가지도록 동기화한다.
하지만 volatile는 상호배제 없이 가시성 보장하는 개념이므로 사용한다고 해서 모든 동기화 문제가 해결되는 건 아니다.다. ( volatile은 원자적 연산에서만 동기화 보장 )
그에 반해 synchronized은 단일 스레드만 진입하도록 하는 배타적 실행 동기화뿐만 아니라 가장 최근의 값(메인 메모리에서)을 가져오는 통신 동기화 기능도 같이 수행 ( 상호배제 + 가시성)
따라서
volatile만으로 동기화가 되는 상황이라면, 배타적 실행을 위해 락을 획득하고 반환하는 비용이 발생하는synchonized보다는 volatile만으로 동기화 처리를 하지만, 만약 배타적 실행 제어가 필요하다면 synchonized를 사용하여 동기화 해준다.