`volatile` 키워드는 자바에서 멀티스레드 환경에서 공유 변수의 가시성을 보장하기 위해 사용된다.
`volatile`로 선언된 변수는 메인 메모리에서 직접 읽기 및 쓰기가 이루어지며
스레드가 변수를 읽을 때마다 항상 가장 최신의 값이 제공된다.
이를 통해 스레드 간의 변수 값의 일관성을 유지할 수 있다.
예시 코드에서는 `volatile` 키워드가 적용된 `flag` 변수를 사용하여 두 개의 스레드가 서로 상태를 공유한다.
스레드 1은 `toggleFlag()` 메서드를 호출하여 `flag` 값을 변경하고,
스레드 2는 `isFlag()` 메서드를 호출하여 `flag` 값을 확인한다.
`flag` 변수가 `volatile`로 선언되었기 때문에 스레드 2에서는 항상 스레드 1에서 변경한 가장 최신의 `flag` 값이 제공된다.
public class VolatileExample {
private volatile boolean flag = false;
public void toggleFlag() {
flag = !flag;
}
public boolean isFlag() {
return flag;
}
public static void main(String[] args) {
VolatileExample example = new VolatileExample();
// 스레드 1: flag 값 변경
Thread thread1 = new Thread(() -> {
example.toggleFlag();
System.out.println("Flag is toggled.");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
// 스레드 2: flag 값 확인
Thread thread2 = new Thread(() -> {
while (!example.isFlag()) {
// flag가 true가 될 때까지 대기
}
System.out.println("Flag is true.");
});
thread1.start();
thread2.start();
}
}
출력결과 예시:
Flag is toggled.
Flag is true.
'JAVA' 카테고리의 다른 글
java.util.function패키지: java.lang.Runnable Supplier<T> Consumer<T> Function<T, R> Predicate<T> (0) | 2024.03.04 |
---|---|
하나의 작업을 작은 단위로 나눠서 여러 스레드가 동시에 처리한다, fork & join 프레임웍 (0) | 2024.02.26 |
스레드의 동기화 lock클래스: ReentrantLock, ReentrantReadWriteLock, StampedLock (0) | 2024.02.26 |
synchronized 동기화를 보완하다, wait()과 notify() 락을 가진 상태로 오랜시간 유지하지않도록 (0) | 2024.02.26 |
synchronized 를 이용한 스레드의 동기화 (0) | 2024.02.26 |