Java

[JVM 밑바닥까지 파헤치기] 12-2. 자바 메모리 모델과 스레드: 자바 메모리 모델

noahkim_ 2024. 12. 26. 00:08

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다

 

1. 자바 메모리 모델

  • 다양한 하드웨어와 운영체제의 서로 다른 메모리 모델로부터 자바 프로그램을 보호하기 위함
  • 플랫폼에 상관없이 메모리를 일관된 방식으로 이용할 수 있음

 

2. 메모리 간 상호 작용

항목 메인 메모리 (Main Memory)
작업 메모리 (Working Memory)
정의 모든 공유 변수가 저장되는 공간
각 스레드가 가지는 고유한 메모리 공간
접근 가능성 모든 스레드가 접근 가능
해당 스레드만 접근 가능
역할 프로그램 전역 상태 저장
메인 메모리의 복사본으로 작업 수행
데이터 이동 read/write 명령어로 작업 메모리와 상호작용
load/store 명령어로 메인 메모리와 동기화
특성 데이터 일관성을 위한 기준점
계산은 여기서 수행되고, 결과는 메인 메모리에 반영됨

 

프로토콜

  • 메인 메모리와 작업 메모리 간 상호작용을 위해 프로토콜이 정의됨
  • read / write: 메인 메모리 ↔️ 작업 메모리 간 데이터 복사 프로토콜
  • load / store: 작업 메모리에서 메인 메모리로 데이터 복사 및 가져오는 명령어

 

Volatile

  • JVM이 제공하는 가장 가벼운 동기화 매커니즘
항목 설명
가시성 보장
모든 스레드에서 항상 메인 메모리 값을 읽고 씀
명령어 재배치 방지
해당 변수 앞뒤 코드 순서가 보장됨
원자성 보장 X
단일 읽기/쓰기만 보장하며 복합 연산은 보장하지 않음
→ synchronized 또는 Atomic 클래스 필요

 

선행 발생 규칙

  • 스레드간의 동작 순서와 메모리 가시성을 정의하는 원칙
규칙 설명
프로그램 순서 규칙
하나의 스레드 안에서는 코드가 작성된 순서대로 실행됨
모니터 락 규칙
락을 해제한 모든 변경은 다음 락 획득 스레드에게 보인다
volatile 변수 규칙
volatile에 기록된 후의 작업은, 다른 스레드의 읽기 이후에 발생함
스레드 시작 규칙
Thread.start() 이전의 작업은 새 스레드의 작업보다 먼저 수행됨
스레드 종료 규칙
Thread.join()은 종료된 스레드의 모든 작업 이후에 실행됨