结构化并发与作用域值传递:超越ThreadLocal
利用结构化并发(JEP 428)和ScopedValue实现不可变上下文自动传递,避免ThreadLocal的内存泄漏和子线程污染。 · 难度:入门 · +10XP
结构化并发与作用域值传递:超越ThreadLocal
ThreadLocal在虚拟线程中可能引发内存泄漏,且不能跨父子任务传递。ScopedValue允许在由StructuredTaskScope管理的任务树中自动传递只读上下文。本教程展示如何配置作用域值,并在失败时处理边界情况,实现类似日志链路跟踪的跨线程传播。
// 使用ScopedValue
public class ScopedValueDemo {
private static final ScopedValue REQUEST_ID = ScopedValue.newInstance();
public void handleRequest(String requestId) {
ScopedValue.where(REQUEST_ID, requestId)
.run(() -> {
// 所有子任务自动继承REQUEST_ID
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
Future task = scope.fork(() -> process());
scope.join();
} catch (Exception e) {}
});
}
private String process() {
// 自动获取父线程的REQUEST_ID
return "Processed " + REQUEST_ID.get();
}
}