volatile은 자바에서 변수의 가시성과 순서에 관련된 특성을 제어하기 위한 제어자입니다. 이것을 사용하면 여러 스레드 간에 변수의 변경 사항이 즉시 반영되며, 컴파일러나 CPU의 최적화에 의해 발생할 수 있는 순서 문제를 방지할 수 있습니다.
volatile의 주요 특징
가시성 (Visibility): volatile 변수를 읽거나 쓰는 모든 스레드는 항상 메모리에서 최신 값을 읽게 됩니다.
순서 (Ordering)
volatile 변수를 통해 변수에 대한 모든 쓰기와 읽기는 순서가 지켜집니다. 다시 말해, 이전의 모든 쓰기 연산이 완료된 후에 다음 쓰기 연산이 수행되고, 이전의 모든 읽기 연산이 완료된 후에 다음 읽기 연산이 수행됩니다.
volatile 사용 예제
public class VolatileExample {
private volatile boolean flag = false;
public void setFlagTrue() {
flag = true;
}
public void printFlag() {
System.out.println("Flag: " + flag);
}
public static void main(String[] args) {
VolatileExample example = new VolatileExample();
// 스레드 1: flag를 true로 설정
Thread thread1 = new Thread(() -> {
example.setFlagTrue();
});
// 스레드 2: flag를 읽어 출력
Thread thread2 = new Thread(() -> {
while (!example.flag) {
// 기다림
}
example.printFlag();
});
// 스레드 시작
thread1.start();
thread2.start();
}
}
이 예제에서는 volatile 키워드를 사용하여 flag 변수를 선언했습니다. 스레드 1에서 setFlagTrue 메서드를 호출하여 flag 값을 true로 설정하고, 스레드 2에서는 flag 변수를 읽어 출력하는 작업을 수행합니다. volatile을 사용하지 않으면 스레드 2가 flag 값을 읽는 동안 캐시된 값을 사용할 수 있어서 무한 루프에 빠질 수 있습니다. volatile을 사용하면 스레드 2가 항상 최신 값을 읽어오므로 예상대로 동작합니다.
With ChatGPT
'JAVA > 포스팅' 카테고리의 다른 글
자바 native 제어자 (0) | 2023.11.12 |
---|---|
자바 transient 제어자 (0) | 2023.11.12 |
자바 synchronized 제어자 (0) | 2023.11.12 |
자바 abstract 제어자 (0) | 2023.11.12 |
자바 static 제어자 (0) | 2023.11.12 |