Concurrency Zaawansowany

Bezpiecznie współdziel dane w stosie wywołań bez pułapek ThreadLocal.

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

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
Wartości zasięgowe
Dostępne

Sfinalizowane w JDK 25 LTS (JEP 506, wrzesień 2025)

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.