Concurrency Zaawansowany

Bezpieczna wątkowo leniwa inicjalizacja bez volatile ani synchronized.

✕ 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ć.
🧹

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
Stabilne wartości
Preview

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

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.