Java

volatile

dev_minpark 2024. 8. 2. 15:42

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