[java] volatile
zl존석동
·2022. 8. 12. 16:39
몇 번 봤었지만 몰라도 될거라고 생각했던 자바 volatile 키워드에 대해 간단하게 공부하고 기록해보았다.
volatile
변수 선언 시 사용하는 키워드 중 하나로 volatile 키워드를 사용하면 변수의 값이 항상 메모리에 쓰여져 있음을 보장할 수 있다.
메모리에 쓰인다니
java에서 일반적으로 변수는 컴파일러나 CPU최적화를 위해 CPU 캐시에 저장된다.
이 때 멀티 스레드 환경에서 다른 스레드가 변수를 변경하면 CPU캐시에 저장된 값과 메모리에 저장된 값이 달라지는 메모리 일관성 문제가 발생할 수 있다.
volatile 키워드를 사용하면 이러한 문제를 해결할 수 있다.
volatile 변수는 항상 메모리에 저장되며 다른 스레드에서 해당 변수를 읽을 때마다 메모리에서 값을 읽어오기 때문에
변수의 값을 항상 최신 값으로 유지할 수 있다!
언제씀
멀티스레드 환경에서 변경이 있는 변수 사용에 유용하다.
하지만 변수의 값을 변경할 때마다 메모리에 직접 쓰이기 때문에 성능 문제가 있을 수 있다.
복잡한 연산이나 동기화 처리가 필요하다면 synchronized 키워드를 써 동기처리를 하는 것이 바람직하다고 한다.
멀티스레드 환경에서 공유하는 플래그나 카운터, 캐시 등에 사용된다고 한다.
public class Counter {
private volatile int count = 0;
public void increment() {
count++;
}
public int getCount() {
return count;
}
}
increment()를 멀티스레드 환경에서 다른 누군가가 count 상태를 변경해도 늘 최신상태를 얻을 수 있게 보장해준다.
주의
멀티스레드 환경에서 여러 스레드가 쓰기 작업을 할 수 있다고 하면 race condition이 발생할 수 있다.
이런 경우에는 결국 synchronized 키워드를 이용해 동기 처리를 해줘야 한다.