Thread-sichere Lazy-Initialisierung ohne volatile oder synchronized.
Code-Vergleich
✕ 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();
}
Problem mit diesem Code entdeckt? Sag uns Bescheid.
Warum der moderne Weg gewinnt
Null Boilerplate
Kein volatile, synchronized oder Null-Prüfungen.
JVM-optimiert
Die JVM kann den Wert nach der Initialisierung falten.
Garantiert einmalig
Der Supplier wird genau einmal ausgeführt, auch unter Contention.
Alter Ansatz
Double-Checked Locking
Moderner Ansatz
StableValue
Seit JDK
25
Schwierigkeitsgrad
Experte
JDK-Unterstützung
Stable Values
Vorschau
Preview in JDK 25 (JEP 502). Erfordert --enable-preview.
Wie es funktioniert
StableValue bietet einen träge initialisierten, unveränderlichen Wert mit eingebauter Thread-Sicherheit. Kein Double-Checked Locking, keine volatile-Felder, keine synchronized-Blöcke. Die JVM kann den Lesepfad nach der Initialisierung sogar optimieren.
Zugehörige Dokumentation