패스잇
CS 기초 · 심화

Java Memory Model (JMM)의 happens-before 관계에 대해 설명하고, volatile 키워드가 JMM 관점에서 어떻게 가시성(visibility)과 순서(ordering)를 보장하는지 내부 동작 원리를 상세히 설명해 주십시오.

힌트 · JMM은 스레드 간 메모리 가시성 규칙을 정의합니다. volatile은 read/write 시 memory barrier를 삽입하여 컴파일러 및 CPU의 재정렬을 방지하고 캐시 일관성을 보장합니다.

Happens-Before가시성(Visibility)순서화(Ordering)메모리 배리어(Memory Barrier)캐시 일관성(Cache Coherence)

모범답안

Java Memory Model (JMM)의 happens-before 관계는 한 스레드 내의 연산 순서뿐 아니라 스레드 간의 연산 순서에 대한 규칙을 정의합니다. A happens-before B라면, A의 결과가 B에게 반드시 보여지는 것을 보장합니다. 즉, A가 B보다 먼저 실행된 결과를 B가 볼 수 있다는 의미입니다.

volatile 키워드는 JMM 관점에서 변수의 가시성과 순서화를 보장합니다. volatile 변수에 대한 쓰기 연산은 항상 메인 메모리에 직접 쓰여지고, 읽기 연산은 항상 메인 메모리에서 읽어옵니다. 이는 각 CPU 코어의 캐시에 저장된 값을 무시하고, 항상 최신 값을 사용하도록 강제합니다.

내부적으로 volatile은 읽기/쓰기 연산 앞뒤에 메모리 배리어(Memory Barrier)를 삽입합니다. 쓰기 배리어는 쓰기 연산이 캐시에만 머무르지 않고 메인 메모리에 즉시 반영되도록 하고, 읽기 배리어는 캐시에서 값을 읽지 않고 메인 메모리에서 최신 값을 읽어오도록 합니다. 이러한 메모리 배리어는 컴파일러와 CPU의 명령어 재정렬을 막아, volatile 변수에 대한 연산 순서가 프로그램 코드에 명시된 순서대로 실행되도록 보장합니다. 결과적으로 volatile은 스레드 간 데이터 경쟁 상황을 방지하고, 예측 가능한 동시성 프로그래밍을 가능하게 합니다.

읽었다면, 이제 직접 답해볼 차례예요

패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.

함께 보는 동시성 / 멀티스레딩 면접 질문

← 동시성 / 멀티스레딩 면접 질문 전체 보기