스핀 락과 적응형 스핀
- 스핀락
- 스레드가 락을 얻기 위해 계속해서 락 상태를 확인해가며 반복적으로 시도하는 방법
- 멀티 코어 시스템에서는 대기 없이 사용 가능
- 스레드 전환 부하는 줄였지만, 프로세서 시간을 소비
- 적응형 스핀
- 락을 기다리는 스레드가 락의 상태와 시스템 상황을 기반으로 스핀을 계속 할지, 블락을 할지 결정
- 하나의 락 객체의 성공 여부에 따라 다음번의 성공 가능성 판단
락 제거
- JVM이 불필요한 락을 제거하여 성능 최적화
- 앞선 챕터에서 언급했듯이 코드가 락을 사용하는 것이 불필요하다고 판단 시 사용 → 오버헤드를 줄일 수 있다.
- 동작 방식
- JVM이 코드가 특정 스레드 내에서 동작하는 지, 다른 스레드가 접근 가능한지 판단
락 범위 확장
- JVM이 동일한 락 객체를 잠그는 과정이 반복되는 것을 탐지한다면 락의 유효범위를 해당 작업 전체로 늘린다.
경량 락
- 경쟁이 없을 때 락을 빠르게 획득 → 경쟁 발생 시 중량락 (일반락)
- 오버헤드를 줄일 수 있다. 단, 경략 락에서 중량락으로 전환 시 일반 락 사용시 보다 비용이 클 수 있다.
- 따라서 경합이 발생하지 않는 환경에서 적합
편향 락
- 락이 특정 스레드에 편향되어 있다고 가정 → 마지막으로 사용한 스레드가 찜
- 다른 스레드가 가져가지 않으면 불필요한 락획득 해제를 줄일 수 있다. (CAS조차 사용하지 않음)→ 오버헤드를 줄일 수 있다.
- 마찬가지로 경합이 발생하지 않는 환경에서 적합
결론
JVM은 프로그램 실행 중 동적 분석을 통해 가장 적합한 락 최적화 기법을 선택
'JVM' 카테고리의 다른 글
가비지 컬렉터와 가비지 컬렉션 알고리즘과 종류 (GC) (0) | 2025.01.13 |
---|---|
Java 스레드 안전한 상태 정의와 구현 방식 (1) | 2024.12.05 |
자바의 동기화 매커니즘 (0) | 2024.12.05 |