[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 키워드를 이용해 동기 처리를 해줘야 한다.