Wartości zasięgowe
Bezpiecznie współdziel dane w stosie wywołań bez pułapek ThreadLocal.
Porównanie kodu
✕ 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);
}
Widzisz problem z tym kodem? Daj nam znać.
Dlaczego nowoczesne podejście wygrywa
Niemutowalny
Wywołani mogą odczytywać, ale nigdy nie modyfikować wartości zasięgowej.
Automatyczne sprzątanie
Bez ręcznego remove() — wartość jest zasięgiem ograniczona do bloku.
Bezpieczny dla wątków wirtualnych
Działa efektywnie z milionami wątków wirtualnych.
Stare podejście
ThreadLocal
Nowoczesne podejście
ScopedValue
Od JDK
25
Poziom trudności
Zaawansowany
Wsparcie JDK
Wartości zasięgowe
Dostępne
Sfinalizowane w JDK 25 LTS (JEP 506, wrzesień 2025)
Jak to działa
ScopedValue zapewnia niemutowalny, dziedziczony, ograniczony zasięgiem kontekst. W przeciwieństwie do ThreadLocal, wartości zasięgowe są automatycznie czyszczone, działają z wątkami wirtualnymi i nie mogą być mutowane przez wywoływanych.
Powiązana dokumentacja
Dowód