Daten über den Aufruf-Stack sicher teilen ohne die Fallstricke von ThreadLocal.
Code-Vergleich
✕ Java 8
static final ThreadLocal<User> CURRENT =
new ThreadLocal<>();
void handle(Request req) {
CURRENT.set(authenticate(req));
try { process(); }
finally { CURRENT.remove(); }
}
✓ Java 25
static final ScopedValue<User> CURRENT =
ScopedValue.newInstance();
void handle(Request req) {
ScopedValue.where(CURRENT,
authenticate(req)
).run(this::process);
}
Problem mit diesem Code entdeckt? Sag uns Bescheid.
Warum der moderne Weg gewinnt
Unveränderlich
Aufgerufene Methoden können den Scoped Value lesen, aber nie ändern.
Automatische Bereinigung
Kein manuelles remove() — der Wert ist auf den Block beschränkt.
Virtual-Thread-sicher
Funktioniert effizient mit Millionen von Virtual Threads.
Alter Ansatz
ThreadLocal
Moderner Ansatz
ScopedValue
Seit JDK
25
Schwierigkeitsgrad
Experte
JDK-Unterstützung
Scoped Values
Verfügbar
Finalisiert in JDK 25 LTS (JEP 506, Sept. 2025).
Wie es funktioniert
ScopedValue bietet unveränderlichen, vererbbaren, bereichsbegrenzten Kontext. Im Gegensatz zu ThreadLocal werden Scoped Values automatisch bereinigt, funktionieren mit Virtual Threads und können von aufgerufenen Methoden nicht verändert werden.
Zugehörige Dokumentation