ロックフリーな遅延初期化
ダブルチェックロッキングを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の読み取りより高速になる可能性があります。
関連ドキュメント