Java

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

noahkim_ 2024. 12. 26. 00:08

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

 

1. 자바 메모리 모델

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

 

2. 메모리 간 상호 작용

메인 메모리

  • 모든 변수가 저장는 공간
  • 다양한 변수에 접근하는 규칙을 정의

 

작업 메모리

  • 각 스레드가 가지는 자체 작업 메모리
  • 격리되어 있음
  • 프로세스의 캐시와 비슷한 역할

 

프로토콜

  • 메인 메모리와 작업 메모리 간 상호작용을 위해 프로토콜이 정의됨
  • read: 메인 메모리에서 데이터를 읽어 작업 메모리에 저장
  • write: 작업 메모리에서 데이터를 읽어 메인 메모리에 저장
  • load / store: 메인 메모리와 작업 메모리 간의 데이터 이동

 

Volatile

  • JVM이 제공하는 가장 가벼운 동기화 매커니즘

 

가시성 보장
  • 모든 스레드에서 이 변수를 투명하게 볼 수 있음
  • 해당 변수는 항상 메인 메모리에 읽히고 적힘
  • 작업 메모리에 적히지 않음

 

명령어 재배치 금지
  • 성능 최적화를 위해 명령어가 재배치되는 상황에서 제외
  • 즉, volatile 변수 앞뒤의 코드 순서가 보장됨

 

원자성 보장 X
  • 자바의 명령어는 원자적이지 않음
    • 실제로는 여러 바이트코드가 수행됨
    • 컨텍스트 스위치는 바이트코드 단위로 이루어짐
  • 원자성 보장을 위해 임계구역으로 보호하기

 

선 발생 원칙

  • 스레드간의 동작 순서와 메모리 가시성을 정의하는 원칙

 

프로그램 순서 규칙
  • 한 스레드 내에ㅐ서 명령어 실행 순서는 순서대로 수행됨

 

모니터 락 규칙
  • synchronized 블록의 잠금과 해제는 순서대로 수행됨

 

volatile 변수 규칙
  • volatile 변수에 기록은 다른 스레드의 volatile 변수의 읽기보다 먼저 발생

 

스레드 시작과 종료 규칙
  • Thread.start()는 새로운 스레드의 작업보다 먼저 발생
  • Thread.join()은 종료된 스레드의 작업보다 나중에 발생