inflearn logo
강의

Course

Instructor

Kim Young-han's Practical Java - Advanced, Part 1: Multithreading and Concurrency

volatile, memory visibility 3

메모리 가시성 문제 질문

72

ksq95116851

15 asked

0

=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
메모리 가시성 문제 가 발생하는 이유는 쓰레드가 공유 된 runFlag 값에 대해 반영이 않되어서 발생하는 문제라고 설명을 해주셨습니다.

 

예를들어 main 쓰레드에서는 false 를 true 로 변경하였으나 work 쓰레드에서는 해당 값이 변경되었는지 모르기 때문에 계속 동작하는 상태 입니다.

 

여기서 이해가 않가는 부분이 모든 프로그램은 보조기억 장치에서 실행을 하고 실행에 필요한 변수가 값 들은 모두 ram 과 같은 주 기억 장치에 저장되고 사용되는 걸로 알고 있습니다.

 

그렇다면 이 과정에서 쓰레드는 캐시메모리가 아닌 주기억 장치에서 값을 읽어서 사용해야 합니다.

 

지금 과정으로 설명된 것을 이해 하면 주기억 장치 또한 단순히 값을 저장하는 것 뿐이고 실제로는 캐시 메모리에서 한번더 데이터를 저장하고 cpu 는 캐시메모리에 접근하여 데이터를 연산한다고 이해 했습니다.

 

맞을까요?

 

java 객체지향 동시성 multithread thread

Answer 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 정동희님.

메모리 가시성 문제와 관련된 질문을 주셨군요. 이에 대한 간단한 요약과 설명을 드리겠습니다.

메모리 가시성 문제란?

메모리 가시성 문제는 주로 여러 스레드가 동시에 변수에 접근할 때 발생합니다. 스레드들은 흔히 각자의 캐시 메모리를 사용하여 변수를 읽고 쓰는데, 이때 한 스레드가 메모리에 쓴 값이 다른 스레드에는 보이지 않는 문제를 말합니다.

왜 발생하는가?

  • 캐시 메모리의 사용: 현대 CPU는 성능을 높이기 위해 각 스레드가 사용하는 값을 캐시 메모리에 저장하고 이 값을 주로 사용합니다. 따라서 스레드가 쓰기 작업을 수행하더라도, 이 변경 사항이 즉시 다른 스레드에게 반영되지 않을 수 있습니다.
  • 주 기억 장치와의 차이: 주 기억 장치(RAM)는 실제로 데이터를 저장하는 곳이지만 CPU는 접근 속도를 높이기 위해 주로 캐시 메모리를 통해 연산을 합니다. 주 기억 장치는 캐시 메모리에 대한 보조적인 역할을 하는 경우가 많습니다.

현상 설명

메인 스레드가 runFlag 값을 변경한다고 해도, 이 변경된 값이 즉시 다른 작업 스레드에 보이지 않을 수 있습니다. 이는 캐시 메모리의 내용이 주 기억 장치에 즉시 반영되지 않거나, 다른 스레드의 캐시로 전파되지 않기 때문입니다.

해결 방법

  • volatile 키워드: 이 키워드를 사용하면 특정 변수가 메모리에 직접 반영되도록 강제하여 메모리 가시성 문제를 해결할 수 있습니다.
  • synchronized: 변수가 정확하게 상호 배타적으로 접근되도록 보장합니다. 이는 메모리 가시성과 원자성을 모두 해결합니다.

관련된 질문에 대해 더 자세한 설명은 아래의 게시글을 참고해 보세요:

  1. 안녕하세요 cas 질문이 있습니다. - volatile과 AtomicInteger 비교.
  2. 메모리 영역에 관해서 질문드릴게요 - 메모리 구조 이해.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

ksq95116851

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

0

yh

네 정동희님 생각하신 내용이 맞습니다 🙂

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