본문 바로가기

자바의 정석 정리

자바의 정석 - 13.10 volatile

13.10.1 volatile

  • 코어에서 값을 읽을 때, 캐시가 아닌 메모리에서 데이터를 읽기 위해 사용
  • 각 코어마다 캐시가 있기 때문에, 쓰레드 작업 시 메모리의 값만 변경하므로 캐시와 데이터 불일치 문제가 발생 할 수 있다
volatile boolean suspend = false;
  • 원자화 : 32bit JVM기준으로 데이터를 4byte로 처리하기 때문에, long과 double과 같은 큰 데이터를 하나의 명령어로 처리할 수 없다. 때문에 두 개 이상의 명령어가 필요한데, 명령어를 통한 데이터를 읽는 과정에서 다른 쓰레드가 끼어 들 수 있어 데이터 불일치 문제가 발생 할 수 있다. 이를 해결하기위해 volatile 사용
volatile long a;
volatile double b;
  • synchronized 블록은 캐시와 메모리를 동기화 시키기 때문에, 이를 사용해도 됨
public synchronized void stop(){
    stopped = true;
}