[JAVA] 고급 1편 (멀티스레드와 동시성) 5 - 메모리 가시성

호호빵·3일 전
0

1. 메모리 가시성

  • 멀티 스레드 환경에서 한 스레드가 변경한 값이 다른 스레드에 언제 보이는지에 대한 문제를 메모리 가시성이라 함

volatile

  • 캐시 메모리를 사용하면 CPU 처리 성능을 개선할 수 있지만 때로는 성능 향상보다 여러 스레드에서 같은 시점에 정확히 같은 데이터를 보는 것이 더 중요할 수 있음
  • 해결방안은 성능을 약간 포기하는 대신 값을 읽고 쓸 때 모두 캐시 메모리가 아닌 메인 메모리에 직접 접근하면 됨
  • volatile 키워드가 해당 기능을 제공
public class volatileFlagMain {
    public static void main(String[] args) {
       MyTask task = new MyTask();
        Thread t = new Thread(task, "work");
        log("runFlag = " + task.runFlag);
        t.start();

        sleep(1000);
        log("runFlag를 false로 변경 시도");
        task.runFlag = false;
        log("runFlag = " + task.runFlag);
        log("main 종료");
    }

    static class MyTask implements Runnable {

        volatile boolean runFlag = true;

        @Override
        public void run() {
            log("task 시작");
            while (runFlag) {
                // runFlag false로 변하면 탈출
            }
            log("task 종료");
        }
    }
}

  • 위 예시에서 volatile 키워드만 추가하면 runFlag에 대해서는 캐시 메모리를 사용하지 않고, 항상 메인 메모리에 직접 접근
  • runFlag = false 변경 즉시 “task 종료”가 출력되며 자바 프로그램도 종료됨




Reference

자바 고급 1편 - 멀티스레드와 동시성

profile
하루에 한 개념씩

0개의 댓글