메모리 가시성 문제 질문
72
15 asked
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
메모리 가시성 문제 가 발생하는 이유는 쓰레드가 공유 된 runFlag 값에 대해 반영이 않되어서 발생하는 문제라고 설명을 해주셨습니다.
예를들어 main 쓰레드에서는 false 를 true 로 변경하였으나 work 쓰레드에서는 해당 값이 변경되었는지 모르기 때문에 계속 동작하는 상태 입니다.
여기서 이해가 않가는 부분이 모든 프로그램은 보조기억 장치에서 실행을 하고 실행에 필요한 변수가 값 들은 모두 ram 과 같은 주 기억 장치에 저장되고 사용되는 걸로 알고 있습니다.
그렇다면 이 과정에서 쓰레드는 캐시메모리가 아닌 주기억 장치에서 값을 읽어서 사용해야 합니다.
지금 과정으로 설명된 것을 이해 하면 주기억 장치 또한 단순히 값을 저장하는 것 뿐이고 실제로는 캐시 메모리에서 한번더 데이터를 저장하고 cpu 는 캐시메모리에 접근하여 데이터를 연산한다고 이해 했습니다.
맞을까요?
Answer 1
0
안녕하세요, 인프런 AI 인턴입니다. 정동희님.
메모리 가시성 문제와 관련된 질문을 주셨군요. 이에 대한 간단한 요약과 설명을 드리겠습니다.
메모리 가시성 문제란?
메모리 가시성 문제는 주로 여러 스레드가 동시에 변수에 접근할 때 발생합니다. 스레드들은 흔히 각자의 캐시 메모리를 사용하여 변수를 읽고 쓰는데, 이때 한 스레드가 메모리에 쓴 값이 다른 스레드에는 보이지 않는 문제를 말합니다.
왜 발생하는가?
- 캐시 메모리의 사용: 현대 CPU는 성능을 높이기 위해 각 스레드가 사용하는 값을 캐시 메모리에 저장하고 이 값을 주로 사용합니다. 따라서 스레드가 쓰기 작업을 수행하더라도, 이 변경 사항이 즉시 다른 스레드에게 반영되지 않을 수 있습니다.
- 주 기억 장치와의 차이: 주 기억 장치(RAM)는 실제로 데이터를 저장하는 곳이지만 CPU는 접근 속도를 높이기 위해 주로 캐시 메모리를 통해 연산을 합니다. 주 기억 장치는 캐시 메모리에 대한 보조적인 역할을 하는 경우가 많습니다.
현상 설명
메인 스레드가 runFlag 값을 변경한다고 해도, 이 변경된 값이 즉시 다른 작업 스레드에 보이지 않을 수 있습니다. 이는 캐시 메모리의 내용이 주 기억 장치에 즉시 반영되지 않거나, 다른 스레드의 캐시로 전파되지 않기 때문입니다.
해결 방법
- volatile 키워드: 이 키워드를 사용하면 특정 변수가 메모리에 직접 반영되도록 강제하여 메모리 가시성 문제를 해결할 수 있습니다.
- synchronized: 변수가 정확하게 상호 배타적으로 접근되도록 보장합니다. 이는 메모리 가시성과 원자성을 모두 해결합니다.
관련된 질문에 대해 더 자세한 설명은 아래의 게시글을 참고해 보세요:
- 안녕하세요 cas 질문이 있습니다. - volatile과 AtomicInteger 비교.
- 메모리 영역에 관해서 질문드릴게요 - 메모리 구조 이해.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0
네 정동희님 생각하신 내용이 맞습니다 🙂
CPU는 ram에서 바로 읽어서 계산하는 것이 아니라 CPU의 캐시 메모리라 레지스트리 같은 공간으로 값을 읽어온 다음에 계산합니다.
감사합니다.
모니터와 synchronized, ReentrantLock, 원자적연산 CAS관련해서 추가적으로 더 깊게 공부했는데 제가 이해한 것이 맞나요??
0
85
1
Future cancel기능을 사용했지만 interrupt가 발생하지 않을 때 어떻게 처리해야하나요?
0
73
2
2.스레드 생성과 실행 - 17P 그림 문의
0
74
2
자바 동시성 현업에서 사용예시가 궁금합니다
0
136
1
ReentrantLock 동작 원리에 대한 질문입니다.
0
83
1
synchronized 대신 join 을 사용하여 순서를 보장할 경우 해법이 아닌가요?
0
94
2
Future4-이유 질문
0
64
1
오타 제보
0
76
2
runnable 질문
0
95
2
자바가 아닌 다른 언어에서도
0
111
1
메모리 가시성 문제가 발생하는 이유
0
125
1
데몬스레드가 어떨 때 사용이 되는지 궁금합니다.
0
78
1
Future.cancel() 취소를 사용하는 예가 궁금합니다.
0
84
1
synchronized 와 인스턴스의 lock
0
91
2
synchronized 키워드만으로 메모리 가시성이 해결되는 이유가 궁급합니다.
0
63
1
[스레드 풀과 Executor 프레임워크1][문제와 풀이] `log("일부 작업이 실패했습니다.");` 실행되는 경우가 있을까요?
0
59
1
원자적 연산이 멀티스레드 상황에서 안전한 이유를 제대로 이해했는지 확인 부탁드립니다
0
67
2
자바 고급 1,2,3편 같이 진행해도 문제없나요
0
77
2
CPU 캐시 때문에도 잔액이 200원이 될 수 있나요?
0
105
2
synchronized 메서드와 join 관련 질문이 있습니다.
0
69
2
섹션 14. 115번 강의 내용 질문
0
83
2
교안에 있는 7페이지 데이터 영역
0
51
1
Executor 스레드 풀 관리 질문
0
108
2
문제와 풀이 질문!
0
78
1

