Concurrency 上級

ダブルチェックロッキングを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 25でプレビュー(JEP 502、StableValue)。--enable-previewが必要です。

StableValueは正しいスレッド安全性を持つ遅延初期化パターンをカプセル化します。JVMは初期化後の読み取りパスを最適化でき、volatileの読み取りより高速になる可能性があります。

共有 𝕏 🦋 in