Concurrency 高级

安全地跨调用栈共享数据,无 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);
}
发现此代码有问题? 告诉我们。
🔒

不可变

被调用方可以读取但永远不能修改作用域值。

🧵

虚拟线程友好

与虚拟线程和结构化并发配合良好。

🧹

无泄漏

作用域退出时自动清理——无需 remove()。

旧方式
ThreadLocal
现代方式
ScopedValue
自 JDK
25
难度
高级
作用域值
可用

在 JDK 25 LTS 中正式发布(JEP 506,2025 年 9 月)。

ScopedValue 提供不可变的、可继承的、作用域受限的上下文。与 ThreadLocal 不同,它适用于虚拟线程,不会泄漏状态,在结构化并发中效果极佳。

分享 𝕏 🦋 in