JAVA
태태개발일지 - 멀티스레딩(김영한 고급 자바)
태태코
2025. 2. 17. 14:05
반응형

메모리 가시성 (Memory Visibility)
스레드를 선언할 때 공유변수를 volatile 으로 선언하는 이유를 알아보았다.
쓰레드와 메인쓰레드는 효율을 위해서 캐시에 변수의 값을 집어넣고 프로세스를 진행한다.
즉. Main Thread에서 기존 쓰레드의 공유변수의 상태값을 바꾼다해도 캐시의 값이 바뀌기 때문에 쓰레드는 그 값의 변화를 인지하지 못한다는 것이다.
private Boolean flag;
를 쓰레드안에 선언해놓고
MainMethod에서
flag = "false";를 선언한다고 해도 바로 실행중인 멀티 스레드에서 인지하지 못한다는 뜻이다.
이것이 메모리의 가시성이다.
이유
위에 언급한 것 처럼, MainThread 와 Multi Trhead모두 변수의 값을 캐시에 불러와서 그 값을 지속적으로 읽기 때문이다.
그렇기에 Context Swiching이 일어나지 않는 이상, 메모리에 직접 접근하여 캐시의 값을 갱신할 일이 없는 것이고,
언제 바뀌는지 정확하지 않다는 뜻이다.
인터럽트 시 변경가능성이 높다. (입 출력) 실제로 Multi Thread에서 System.out.println();을 톻해 출력으로 인터럽트를 줄 시, 메모리에 접근하여 값을 갱신하는 것을 볼 수 있다.
volatile
즉 volatile 키워드를 통해서 캐시가 아닌 직접 메모리를 바라보게하여, Main Method에서 flag를 false로 바꾸었을 때 바로 정지할 수 있는 방법을 사용하는 것이다.
하지만 알아둬야 할 점은, 계속 캐시가 아닌 메모리를 바라보기 때문에, 성능차이가 날 수 있다는 점이다.
실제로 테스트를 해보면,
volatile을 사용하지 않는 경우와 volatile 사용하는 경우 약 11배의 속도차이를 볼 수 있다.

결론
메모리의 가시성 이 일어나는 경우에는 volatile을 사용해야한다.
반응형