BackEnd/Java

[Java] 메모리 가시성 - volatile

kangminhyuk1111 2024. 8. 19. 09:18

main 스레드와 work 스레드가 존재 할 때, 맨 처음에 메모리에서 runFlag의 값을 가져오고 main 스레드와 work 스레드는 메인스레드의 runFlag값인 false를 가지고 있다.

 

main -> false
work -> false

 

이 상태에서 메인 메모리에 접근하는 것이 아니라, main과 work는 runFlag의 값을 복사해서 스레드에서 캐시 메모리에 가지고 있게 된다.

 

캐시 메모리는 cpu와 매우 근접해있으며, 속도도 매우 빠른 메모리이기 때문에, 속도 측면에서 매우 유리하다. 하지만 비용이 비싼 메모리 이기 때문에, 큰 용량을 구성하기는 어렵다.

 

본론으로 돌아와서 main과 work의 캐시 메모리에 저장이 되어있고 이 상태를 main 스레드에서 변경하게 된다. runFlag를 true로 변경한다면 어떻게 될까?

 

main -> true
work -> false

 

여기서 문제가 발생하는데, main 스레드에서 변경을하면 메인 메모리의 runFlag 값이 변경되는 것이 아니라, main 메모리의 캐시 메모리의 runFlag값이 변경되게 되고 메인 메모리와 work 스레드의 메모리는 값이 변경되지 않게 되는 상황이 발생한다.

 

이 상황을 메모리 가시성 문제라고 칭한다.

 

캐시 메모리는 컨텍스트 스위칭이 일어날 때, 메모리가 갱신된다. 하지만 컨텍스트 스위칭이 일어난다고 해서 무조건 메모리 갱신이 보장되는 것은아니다.

 

volatile -> 항상 메인 메모리에 반영되는 변수로 할당시키는 것

반응형