结构化并发与作用域值:替代ThreadLocal
利用StructuredTaskScope和ScopedValue,实现任务生命周期内的上下文传递,避免内存泄漏与线程池污染。 · 难度:入门 · +10XP
告别ThreadLocal:作用域值的正确打开方式
ThreadLocal在线程池中容易导致数据泄漏或过期。ScopedValue是JEP 429提出的新方案,它被绑定在当前线程的执行范围内,且不可变。结合StructuredTaskScope,可以将父任务的上下文自动传播到所有子任务,任务结束自动清理。本课还讲解StructuredTaskScope.shutdownOnFailure的短路取消机制,以及如何与虚拟线程配合。
public static final ScopedValue<String> USER_ID = ScopedValue.newInstance();
void handleRequest(String userId) {
ScopedValue.where(USER_ID, userId)
.run(() -> {
// 在此作用域内,所有子任务可以获取USER_ID
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
Future<?> task1 = scope.fork(() -> doSomething());
Future<?> task2 = scope.fork(() -> doOther());
scope.join();
}
});
}
String doSomething() {
return "User: " + USER_ID.get();
}