저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다
1. 자바 메모리 모델
- 다양한 하드웨어와 운영체제의 서로 다른 메모리 모델로부터 자바 프로그램을 보호하기 위함
- 플랫폼에 상관없이 메모리를 일관된 방식으로 이용할 수 있음
2. 메모리 간 상호 작용
메인 메모리
- 모든 변수가 저장는 공간
- 다양한 변수에 접근하는 규칙을 정의
작업 메모리
- 각 스레드가 가지는 자체 작업 메모리
- 격리되어 있음
- 프로세스의 캐시와 비슷한 역할
프로토콜
- 메인 메모리와 작업 메모리 간 상호작용을 위해 프로토콜이 정의됨
- read: 메인 메모리에서 데이터를 읽어 작업 메모리에 저장
- write: 작업 메모리에서 데이터를 읽어 메인 메모리에 저장
- load / store: 메인 메모리와 작업 메모리 간의 데이터 이동
Volatile
- JVM이 제공하는 가장 가벼운 동기화 매커니즘
가시성 보장
- 모든 스레드에서 이 변수를 투명하게 볼 수 있음
- 해당 변수는 항상 메인 메모리에 읽히고 적힘
- 작업 메모리에 적히지 않음
명령어 재배치 금지
- 성능 최적화를 위해 명령어가 재배치되는 상황에서 제외
- 즉, volatile 변수 앞뒤의 코드 순서가 보장됨
원자성 보장 X
- 자바의 명령어는 원자적이지 않음
- 실제로는 여러 바이트코드가 수행됨
- 컨텍스트 스위치는 바이트코드 단위로 이루어짐
- 원자성 보장을 위해 임계구역으로 보호하기
선 발생 원칙
- 스레드간의 동작 순서와 메모리 가시성을 정의하는 원칙
프로그램 순서 규칙
- 한 스레드 내에ㅐ서 명령어 실행 순서는 순서대로 수행됨
모니터 락 규칙
- synchronized 블록의 잠금과 해제는 순서대로 수행됨
volatile 변수 규칙
- 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 |