Stabilne wartości
Bezpieczna wątkowo leniwa inicjalizacja bez volatile ani synchronized.
Porównanie kodu
✕ Java 8
private volatile Logger logger;
Logger getLogger() {
if (logger == null) {
synchronized (this) {
if (logger == null)
logger = createLogger();
}
}
return logger;
}
✓ Java 25 (Preview)
private final StableValue<Logger> logger =
StableValue.of(this::createLogger);
Logger getLogger() {
return logger.get();
}
Widzisz problem z tym kodem? Daj nam znać.
Dlaczego nowoczesne podejście wygrywa
Zero boilerplate
Bez volatile, synchronized ani sprawdzeń null.
Optymalizacja JVM
JVM może zoptymalizować wartość po inicjalizacji.
Gwarantowane jednokrotne wykonanie
Dostawca uruchamia się dokładnie raz, nawet przy rywalizacji.
Stare podejście
Podwójnie sprawdzane blokowanie
Nowoczesne podejście
StableValue
Od JDK
25
Poziom trudności
Zaawansowany
Wsparcie JDK
Stabilne wartości
Preview
Podgląd w JDK 25 (JEP 502). Wymaga --enable-preview
Jak to działa
StableValue zapewnia leniwie inicjalizowaną, niemutowalną wartość z wbudowanym bezpieczeństwem wątków. Bez podwójnie sprawdzanego blokowania, bez pól volatile, bez bloków synchronized. JVM może nawet zoptymalizować ścieżkę odczytu po inicjalizacji.
Powiązana dokumentacja
Dowód