inflearn logo
강의

Course

Instructor

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

Java Memory Model

메모리 가시성 문제가 발생하는 이유

125

InflearnSang

1 asked

0

멀티스레드 환경에서 메모리 가시성 문제가 발생하는 이유를, CPU 캐시와 메인 메모리 간의 데이터 갱신 시점 차이 때문이라고 이해했습니다.
그렇다면 이 현상은 하드웨어 수준의 문제로 봐야 할까요, 아니면 JVM의 메모리 관리 방식이 영향을 주는 걸까요?
또한, 이런 문제가 자바가 컴파일 언어이기 때문에 발생하는지도 궁금합니다.

java 객체지향 동시성 multithread thread

Answer 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 상우진님!

멀티스레드 환경에서 메모리 가시성 문제가 발생하는 이유에 대한 질문을 주셨네요. 이를 이해하기 위해 몇 가지 주요 개념을 짚어보겠습니다.

메모리 가시성 문제의 기초

  1. CPU 캐시와 메인 메모리: 현대 시스템에서는 CPU 코어가 자신의 캐시에 데이터를 저장하고 이곳에서 대부분의 연산을 처리합니다. 이 캐시 시스템은 메모리 접근 속도를 줄이기 위한 성능 최적화입니다. 그러나 캐시의 값이 항상 메인 메모리와 동기화되어 있지 않기 때문에, 멀티스레드 환경에서는 스레드 간에 일관되지 않은 값을 읽는 문제가 발생할 수 있습니다.

  2. JVM 메모리 모델: 자바는 JVM의 메모리 모델에 따라 메모리 사용을 관리합니다. volatile 키워드나 동기화 블록은 JVM이 스레드 간의 메모리 가시성을 보장하도록 하는 방법들입니다. 하지만 기본적으로 JVM이 직접 하드웨어와 소통하는 것은 아니므로, CPU의 캐시 동작 방식 자체가 문제의 근본으로 볼 수 있습니다.

  3. 컴파일 언어와의 관계: 자바는 컴파일 언어(Lower-level language)로, 바이트코드로 컴파일 된 후 JVM에 의해 실행됩니다. 이 과정에서 하드웨어와의 직접적인 소통은 JVM이 담당하며, CPU 캐시와 메인 메모리 간의 불일치는 자바가 컴파일 언어이기 때문이라기보다는, 컴파일된 상태에서 JVM이 어떠한 스레드 모델을 사용하냐에 크게 의존합니다.

결론

결론적으로, 메모리 가시성 문제는 주로 하드웨어(특히 CPU 캐시)의 특성에 기인하지만, JVM의 메모리 관리 방식과도 일부 관련이 있습니다. 하지만 이는 언어가 컴파일되었기 때문에 발생하는 문제는 아닙니다. 메모리 가시성 문제는 여러 프로그래밍 언어와 플랫폼에서 공통적으로 등장하는 문제입니다.

관련하여 보다 더 깊이 있는 논의는 Inflearn의 질문 게시판에서도 확인할 수 있습니다. 추가로 다음 링크들도 참고하면 도움이 될 것입니다:

  1. 안녕하세요 cas 질문이 있습니다.
  2. 강의를 듣다 문득, ThreadLocal과 synchronized의 성능차이?가 궁금하여서 질문했습니다.

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

모니터와 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

메모리 가시성 문제 질문

0

72

1

Future4-이유 질문

0

64

1

오타 제보

0

76

2

runnable 질문

0

95

2

자바가 아닌 다른 언어에서도

0

111

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