비동기적으로 실행되는 두 스레드 사이에 공유 자원을 공유하는 동안 가시성 문제와 원자성 문제가 발생할 수 있다.
멀티 CPU(단인 CPU) 환경에서 각 스레드가 작업을 처기하기 위해 필요한 데이터를 Main Memory에서 읽어들여서 각자 자기 CPU Cache Memory에 복제한다. 하지만 메인 메모리는 모든 스레드들에 의해 공유되지만 CPU Cache Memory는 각 스레드가 독립적으로 사용한다.
그래서 두 스레드가 비동기적으로(동시에) 공유하고 있는 변수가 각자 CPU Cache Memory에 복제가 되면 그 변수가 더이상 두 스레드사이에 공유되지 않는다.
✅ CPU 캐시를 사용하는 이유 메인 메모리는 CPU보다 속도가 훨씬 느림 → CPU는 캐시를 사용해 사용하는 변수를 저장하고 빠르게 읽음.
자바의 멀티스레딩 환경에서 한 스레드가 변경한 값을 다른 스레드가 즉시 볼 수 있는 것이 보장되지 않는 문제를 의미한다. 즉, 비동기적으로 실행되는 두 스레드가 있고 두 스레드 사이에 공유되는 변수를 한 스레드가 자기 CPU Cache Memory에 복제해가면 다른 스레드가 그 변수의 최신 값을 확인하지 못한다.
A 스레드가 공유 변수(boolean)
을 Main memory에서 읽고 자기 Cache Memory에서 연산을 수행한다. 하지만 반복문으로 그 변수
가 true인 동안 A 스레드가 돌아가게 코드를 구현하고, 그 변수
를 false로 바꿔주는 코드를 다른 B 스레드에 의해 실행이 되고 있으면 B가 중간에 그 변수
를 false로 바꿔주고 다시 Main Memory 에 저장해도 A스레드는 자기 Cache Memory에 복제된 변수
만 보이기 때문에 변수의 최신 상태가 공유되지 않아 A 스레드가 무한루프에 빠짐.
→ 공유 되는 변수에 연산 과정 x, 단순히 값의 상태 변경(ex. boolean flag 변수)
🧐 그렇다면 공유되는 변수에 연산을 수행하는 과정에서는?
자바의 멀티스레딩 환경에서 여러 개의 스레드가 같은 변수를 동시에 수정(연산)할 때, 연산이 완전히 수행되지 않거나 예상치 못한 값이 저장될 수 있는 문제.