volatile keyword는 Java 변수를 Main Memory에 저장하겠다라는 것을 명시하는 것
매번 변수의 값을 Read할 때마다 CPU cache에 저장된 값이 아닌 Main Memory에서 읽는 것
또한 변수의 값을 Write할 때마다 Main Memory에 까지 작성하는 것
SharedObject를 공유하는 두 개의 Thread가 있다
Thread-1는 counter 값을 더하고 읽는 연산을 한다. (Read & Write)
Thread-2는 counter 값을 읽기만 한다.(Only Read)
public class SharedObject { public int counter = 0;}
Thread-1은 counter값을 증가시키고 있지만 CPU Cache에만 반영되어있고 실제로 Main Memory에는 반영이 되지 않는다. 그렇기 때문에 Thread-2는 count값을 계속 읽어오지만 0을 가져오는 문제가 발생한다.
volatile 키워드를 추가하게 되면 Main Memory에 저장하고 읽어오기 때문에 변수 값 불일치 문제를 해결 할 수 있습니다.
public class SharedObject { public volatile int counter = 0;}
Multi Thread 환경에서 하나의 Thread만 read & write하고 나머지 Thread가 read하는 상황에서 가장 최신의 값을 보장
volatile는 변수의 read와 write를 Main Memory에서 진행하게 된다.
CPU Cache보다 Main Memory가 비용이 더 크기 때문에 변수 값 일치을 보장해야 하는 경우에만 volatile 사용하는 것이 좋다
성능 좋은 순서 cpu cache 에 저장 > 메인 메모리 저장 ( volatile ) > synchronized