저우즈밍 님의 "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()은 종료된 스레드의 모든 작업 이후에 실행됨
|
'Java' 카테고리의 다른 글
[Effective Java] 2-1. 객체 생성과 파괴: 생성자 대신 정적 팩토리 메서드를 고려하라 (0) | 2024.12.26 |
---|---|
[JVM 밑바닥까지 파헤치기] 12-3. 자바 메모리 모델과 스레드: 스레드 (1) | 2024.12.26 |
[JVM 밑바닥까지 파헤치기] 12-1. 자바 메모리 모델과 스레드: 동시성 (1) | 2024.12.25 |
[JVM 밑바닥까지 파헤치기] 11-2. 백엔드 컴파일과 최적화: JIT 컴파일러 (0) | 2024.12.25 |
[JVM 밑바닥까지 파헤치기] 11-1. 백엔드 컴파일과 최적화: 백엔드 컴파일 (0) | 2024.12.25 |