volatile 개념
다중 스레드 환경에서 변수의 가시성과 순서에 대한 동기화를 제어하는 데 사용됩니다.
가시성 보장
스레드 A가 변수를 수정하고 스레드 B가 해당 변수를 읽을 때, 스레드 B가 스레드 A의 수정 내용을 정확하게 볼 수 있어야 합니다. volatile 키워드를 사용하면 캐시를 사용하지 않고 변수의 값을 항상 메인 메모리에서 읽고 쓰도록 보장하므로 다른 스레드에 대한 가시성을 보장합니다.
순서 보장
volatile 키워드를 사용하면 변수의 변경 순서가 항상 일관적으로 유지됩니다. 즉, 변수의 변경이 항상 이전 변경에 따라 발생하고, 이후 변경이 이전 변경에 따라 발생합니다.
이를 통해 변수의 수정 순서가 잘못된 결과를 초래하는 문제를 방지할 수 있습니다.
public class Example {
public int a;
public int b;
public volatile int c; // volatile 기준
public int d;
public void update(int a, int b, int c, int d) {
this.a = a;
this.b = b;
this.c = c; // a,b,c 메인 메모리에 기록됨
this.d = d;
}
}
volatile 주의사항
여러 스레드가 동시에 변수를 수정하려면 추가적인 동기화가 필요할 수 있습니다.
변수는 주로 읽기 연산이 많은 상황에서 사용됩니다.
volatile 예시
synchronized와 함께 사용하여 더블 체크 락 패턴을 사용할 수 있습니다.
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
'JAVA > 스레드' 카테고리의 다른 글
[JAVA] ReentrantLock 활용 Condition 인터페이스 (1) | 2023.10.04 |
---|---|
[JAVA] wait(), notify(), notifyAll() 메서드 (2) | 2023.09.25 |
[JAVA] synchronized와 static synchronized의 차이점(block, method) (0) | 2023.09.25 |
[JAVA] synchronized 키워드와 락(Lock) 개념 (0) | 2023.09.25 |
[JAVA] 공유 자원과 경쟁 상태와 임계 영역 (0) | 2023.09.11 |