인프런 커뮤니티 질문&답변
메모리 가시성 문제 질문
작성
·
18
0
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
메모리 가시성 문제 가 발생하는 이유는 쓰레드가 공유 된 runFlag 값에 대해 반영이 않되어서 발생하는 문제라고 설명을 해주셨습니다.
예를들어 main 쓰레드에서는 false 를 true 로 변경하였으나 work 쓰레드에서는 해당 값이 변경되었는지 모르기 때문에 계속 동작하는 상태 입니다.
여기서 이해가 않가는 부분이 모든 프로그램은 보조기억 장치에서 실행을 하고 실행에 필요한 변수가 값 들은 모두 ram 과 같은 주 기억 장치에 저장되고 사용되는 걸로 알고 있습니다.
그렇다면 이 과정에서 쓰레드는 캐시메모리가 아닌 주기억 장치에서 값을 읽어서 사용해야 합니다.
지금 과정으로 설명된 것을 이해 하면 주기억 장치 또한 단순히 값을 저장하는 것 뿐이고 실제로는 캐시 메모리에서 한번더 데이터를 저장하고 cpu 는 캐시메모리에 접근하여 데이터를 연산한다고 이해 했습니다.
맞을까요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 정동희님.
메모리 가시성 문제와 관련된 질문을 주셨군요. 이에 대한 간단한 요약과 설명을 드리겠습니다.
메모리 가시성 문제란?
메모리 가시성 문제는 주로 여러 스레드가 동시에 변수에 접근할 때 발생합니다. 스레드들은 흔히 각자의 캐시 메모리를 사용하여 변수를 읽고 쓰는데, 이때 한 스레드가 메모리에 쓴 값이 다른 스레드에는 보이지 않는 문제를 말합니다.
왜 발생하는가?
- 캐시 메모리의 사용: 현대 CPU는 성능을 높이기 위해 각 스레드가 사용하는 값을 캐시 메모리에 저장하고 이 값을 주로 사용합니다. 따라서 스레드가 쓰기 작업을 수행하더라도, 이 변경 사항이 즉시 다른 스레드에게 반영되지 않을 수 있습니다.
- 주 기억 장치와의 차이: 주 기억 장치(RAM)는 실제로 데이터를 저장하는 곳이지만 CPU는 접근 속도를 높이기 위해 주로 캐시 메모리를 통해 연산을 합니다. 주 기억 장치는 캐시 메모리에 대한 보조적인 역할을 하는 경우가 많습니다.
현상 설명
메인 스레드가 runFlag 값을 변경한다고 해도, 이 변경된 값이 즉시 다른 작업 스레드에 보이지 않을 수 있습니다. 이는 캐시 메모리의 내용이 주 기억 장치에 즉시 반영되지 않거나, 다른 스레드의 캐시로 전파되지 않기 때문입니다.
해결 방법
- volatile 키워드: 이 키워드를 사용하면 특정 변수가 메모리에 직접 반영되도록 강제하여 메모리 가시성 문제를 해결할 수 있습니다.
- synchronized: 변수가 정확하게 상호 배타적으로 접근되도록 보장합니다. 이는 메모리 가시성과 원자성을 모두 해결합니다.
관련된 질문에 대해 더 자세한 설명은 아래의 게시글을 참고해 보세요:
- 안녕하세요 cas 질문이 있습니다. - volatile과 AtomicInteger 비교.
- 메모리 영역에 관해서 질문드릴게요 - 메모리 구조 이해.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






그렇다면 우리가 일반적으로 말하는 메모리 에 대한 얘기는 주기억 장치인 ram 이 아니라 캐시메모리 라고 봐도 무방하나요?