Volatile
- 자바에서 변수의 값을 메인 메모리에 저장하고, 다른 스레드가 읽을 때 항상 최신 값을 읽도록 보장하는데 사용
주로 스레드 간의 변수 일관성을 유지하기 위해 사용된다.
스레드 동시성 문제
- 스레드가 동시에 공유 자원에 접근하고 수정할 때 발생 이러한 문제는 스레드 간의 변수 값이 일치하지 않거나, 예상치 못한 결과를 초래할 수 있다.
- 스레드 스택 : 각 스레드마다 스택이 존재하며 지역 변수와 함수 호출이 저장된다.
Volatile 키워드를 사용하면, 변수의 값이 메인 메모리에 바로 쓰여지고 다른 스레드가 이 값을 읽을 때 최신 값을 읽도록 보장된다.
public class VolatileExample {
private volatile boolean flag = false;
public void writer() {
flag = true; // 쓰기 스레드가 flag 값을 true로 설정
}
public void reader() {
if (flag) {
System.out.println("Flag is true!"); // 읽기 스레드가 flag 값을 확인
} else {
System.out.println("Flag is false.");
}
}
public static void main(String[] args) throws InterruptedException {
VolatileExample example = new VolatileExample();
Thread writerThread = new Thread(() -> {
example.writer();
});
Thread readerThread = new Thread(() -> {
example.reader();
});
writerThread.start();
Thread.sleep(100); // writerThread가 먼저 실행될 시간을 확보
readerThread.start();
}
}
Static 과의 차이점
동작 방식 : volatile 변수의 읽기와 쓰기는 항상 메인 메모리에서 수행되지만, static 변수는 클래스 로딩 시 메모리에 할당되며, 모든 인스턴스가 동일한 메모리 위치를 잠조한다.
- volatile 변수를 사용하면 각 스레드가 항상 최신 값을 읽고 쓰기 때문에 스레드 간 변수의 가시성을 보장하지만, 원자적 연산을 보장하지는 않는다
- static 변수를 사용하면 클래스 수준에서 변수를 공유할 수 있지만, 동시성 무제를 해결하지는 않는다.
서로 다른 목적을 가지고 있는 키워드이기 때문에 상황에 맞는 적절한 키워드를 사용해야 된다.
- volatile 변수의 가시성을 보장하고 싶을 때, static 클래스 수준에서 변수를 공유하고 싶을 때
'Java' 카테고리의 다른 글
| UtilClass (0) | 2024.09.05 |
|---|---|
| collect(), toList() 비교 (0) | 2024.07.11 |
| Mac <-> Windows Unicode 자소 분리 개선 (0) | 2024.07.11 |
| javax.validation.constraints 밸리데이션 속성 (0) | 2024.07.11 |