Concurrency Avançado

Compartilhe dados entre pilhas de chamadas com segurança, sem as armadilhas do 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);
}
Viu um problema com este código? Nos avise.
🔒

Imutável

Os chamados podem ler, mas nunca modificar o valor com escopo.

🧹

Limpeza automática

Sem remove() manual — o valor é limitado ao bloco.

Seguro para virtual threads

Funciona eficientemente com milhões de virtual threads.

Abordagem Antiga
ThreadLocal
Abordagem Moderna
ScopedValue
Desde o JDK
25
Dificuldade
Avançado
Valores com escopo
Disponível

Finalizado no JDK 25 LTS (JEP 506, setembro de 2025).

ScopedValue fornece contexto imutável, herdável e limitado ao escopo. Diferente de ThreadLocal, valores com escopo são automaticamente limpos, funcionam com virtual threads e não podem ser alterados pelos chamados.

Compartilhar 𝕏 🦋 in