Concurrency Avancé

Partagez des données le long de la pile d'appels en toute sécurité sans les problèmes de 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);
}
Un problème avec ce code ? Dites-le nous.
🔒

Immutable

Les méthodes appelées peuvent lire mais jamais modifier la valeur à portée.

🧹

Nettoyage automatique

Sans remove() manuel — la valeur est limitée au bloc.

Compatible avec les threads virtuels

Fonctionne efficacement avec des millions de threads virtuels.

Ancienne Approche
ThreadLocal
Approche Moderne
ScopedValue
Depuis JDK
25
Difficulté
Avancé
Valeurs à portée
Disponible

Finalisé dans JDK 25 LTS (JEP 506, sept. 2025).

ScopedValue fournit un contexte immutable, héritable et limité à une portée. Contrairement à ThreadLocal, les valeurs à portée sont nettoyées automatiquement, fonctionnent avec les threads virtuels et ne peuvent pas être modifiées par les méthodes appelées.

Partager 𝕏 🦋 in