Ленивая инициализация без блокировок
Замена двойной проверки блокировки на 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
Ленивая инициализация без блокировок
Предварительный просмотр
Preview в JDK 25 (JEP 502, StableValue). Требует --enable-preview.
Как это работает
StableValue инкапсулирует паттерн ленивой инициализации с корректной потокобезопасностью. JVM может оптимизировать путь чтения после инициализации, делая его потенциально быстрее, чем volatile-чтения.
Связанная документация
Доказательство