Java volatile 한정자

필드 값 캐시 억제 – volatile 한정자

다중 스레드 환경에서는 성능을 향상시키기 위해 각 스레드가 필드 값을 개별적으로 캐시할 수 있다. 스레드가 원래 메모리를 읽고 쓰는 과정을 줄여 성능을 향상시키고 있다.

다만, 이것은 thread에 의해 같은 필드의 참조 값이 다른 위험에 대한 방어를 위해 사용되기도 한다. 만약 값의 불일치를 회피하고 싶은 경우에는 volatile 수식자를 부여하는 것으로 필드 값의 캐쉬를 제한할 수 있다.

public class ModVolatile {
  volatile int shareValue;  // 캐시 대상 제외
}

별도로 해당하는 필드를 조작하고 있는 곳을 synchronized 블록(수식자)로 표현하는 것도 가능하다. synchronized 블록 아래에서 취급하는 필드 값은 반드시 원래 메모리에서 읽고 다시 쓰여지므로 캐시 불일치를 피할 수 있다. 그러나, 간단한 값을 읽고 쓰는 작업에서 synchronized 블록으로 묶는 것은 중복이므로 이러한 작업이 자주 발생하는 경우 volatile 수식자를 사용한다.




최종 수정 : 2022-10-03