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
Сложность
Продвинутый
Ленивая инициализация без блокировок
Предварительный просмотр

Preview в JDK 25 (JEP 502, StableValue). Требует --enable-preview.

StableValue инкапсулирует паттерн ленивой инициализации с корректной потокобезопасностью. JVM может оптимизировать путь чтения после инициализации, делая его потенциально быстрее, чем volatile-чтения.