代码对比
✕ 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 支持
作用域值
可用
在 JDK 25 LTS 中正式发布(JEP 506,2025 年 9 月)。
工作原理
ScopedValue 提供不可变的、可继承的、作用域受限的上下文。与 ThreadLocal 不同,它适用于虚拟线程,不会泄漏状态,在结构化并发中效果极佳。
相关文档