Concurrency Zaawansowany

Zastąp podwójnie sprawdzane blokowanie przez StableValue dla leniwych singletonów.

✕ 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();
    }
}
Widzisz problem z tym kodem? Daj nam znać.
🧹

Zero boilerplate

Bez volatile, synchronized ani podwójnego sprawdzania null.

Szybsze odczyty

JVM może zoptymalizować wartość po inicjalizacji.

Dowodliwa poprawność

Żadnych subtelnych błędów kolejności — JVM to obsługuje.

Stare podejście
synchronized + volatile
Nowoczesne podejście
StableValue
Od JDK
25
Poziom trudności
Zaawansowany
Leniwa inicjalizacja bez blokad
Preview

Podgląd w JDK 25 (JEP 502, StableValue). Wymaga --enable-preview

StableValue hermetyzuje wzorzec leniwej inicjalizacji z poprawnym bezpieczeństwem wątków. JVM może zoptymalizować ścieżkę odczytu po inicjalizacji, co potencjalnie czyni go szybszym niż odczyty volatile.