락 없는 지연 초기화
지연 초기화 싱글톤을 위해 이중 검사 잠금을 StableValue로 대체합니다.
코드 비교
✕ Java 8
class Config {
private static volatile Config inst;
static Config get() {
if (inst == null) {
synchronized (Config.class) {
if (inst == null)
inst = load();
}
}
return inst;
}
}
✓ Java 25 (Preview)
class Config {
private static final
StableValue<Config> INST =
StableValue.of(Config::load);
static Config get() {
return INST.get();
}
}
이 코드에 문제가 있나요? 알려주세요.
모던 방식이 더 나은 이유
보일러플레이트 없음
volatile, synchronized, 이중 null 확인이 필요 없습니다.
더 빠른 읽기
JVM이 초기화 후 상수로 최적화할 수 있습니다.
증명 가능한 정확성
미묘한 순서 버그 없음 — JVM이 처리합니다.
이전 방식
synchronized + volatile
모던 방식
StableValue
JDK 버전
25
난이도
고급
JDK 지원
락 없는 지연 초기화
프리뷰
JDK 25에서 프리뷰 (JEP 502, StableValue). --enable-preview가 필요합니다.
동작 원리
StableValue는 올바른 스레드 안전성으로 지연 초기화 패턴을 캡슐화합니다. JVM은 초기화 후 읽기 경로를 최적화하여 volatile 읽기보다 빠르게 만들 수 있습니다.
관련 문서