当前位置: 首页 > news >正文

TransmittableThreadLocal使用场景

🚀 为什么要用 TransmittableThreadLocal?一文读懂线程上下文传递问题

在 Java Web 开发中,我们经常用 ThreadLocal 来保存每个请求的用户信息,例如 userId。但当我们使用线程池或异步方法(如 @Async)时,很多人会遇到这样的问题:

❗ 主线程设置了 ThreadLocal,子线程里却拿不到!

这是因为 ThreadLocal 的值默认不会在线程池中传递到子线程,会导致上下文丢失,比如 userId 为 null,traceId 无法传递等问题。


🧩 问题重现

// 主线程中设置用户 ID
UserContext.setUserId(123L);// 子线程中获取(比如线程池执行)
executorService.submit(() -> {System.out.println(UserContext.getUserId()); // 输出 null
});

✅ 解决方案:使用阿里开源的 TransmittableThreadLocal (TTL)

TransmittableThreadLocal 是阿里巴巴开源的增强版 ThreadLocal,可以将主线程中的上下文信息,传递到子线程中(包括线程池中)

简单改造:

1. 引入依赖
<dependency><groupId>com.alibaba</groupId><artifactId>transmittable-thread-local</artifactId><version>2.14.2</version> <!-- 版本可选最新 -->
</dependency>
2. 替换原有 ThreadLocal
public class UserContext {private static final TransmittableThreadLocal<Long> userIdThreadLocal = new TransmittableThreadLocal<>();public static void setUserId(Long userId) {userIdThreadLocal.set(userId);}public static Long getUserId() {return userIdThreadLocal.get();}public static void clear() {userIdThreadLocal.remove();}
}
3. 包装子线程任务
Runnable task = () -> {System.out.println(UserContext.getUserId());
};executorService.submit(TtlRunnable.get(task)); // TTL 包装,自动传递上下文

⚙ Spring 用户更方便

如果你使用 Spring 的 @Async 或线程池,可以配合 TTL 的 插件支持 实现自动上下文传递,无需手动包装。


📌 总结对比

对比项ThreadLocalTransmittableThreadLocal
支持线程上下文传递❌ 否✅ 是
在线程池中能获取值❌ 否✅ 是
推荐场景单线程多线程、异步、线程池
是否侵入业务代码❌ 少✅ 极小,可自动适配

🧠 使用 TTL,你可以轻松实现:

  • 日志 traceId 传递
  • 用户上下文(userId、token)传递
  • 请求头信息传播
  • 分布式链路追踪

🔗 推荐阅读项目地址:https://github.com/alibaba/transmittable-thread-local

欢迎点赞、评论交流你在实际使用中的坑与经验 👇

相关文章:

  • 「Mac畅玩AIGC与多模态41」开发篇36 - 用 ArkTS 构建聚合搜索前端页面
  • 中药药效成分群的合成生物学研究进展-文献精读130
  • 智慧校园(含实验室)智能化专项汇报方案
  • windows 10 做服务器 其他电脑无法访问,怎么回事?
  • Kotlin变量与数据类型详解
  • 无监督学习在医疗AI领域的前沿:多模态整合、疾病亚型发现与异常检测
  • WORD个人简历单页326款模版分享下载
  • c#车检车构客户管理系统软件车辆年审短信提醒软件
  • 2025年PMP 学习十八 第11章 项目风险管理 (11.5~11.7)
  • Linux:计算机的层状结构
  • Javascript:WebAPI
  • Linux - 2.系统命令
  • Qt 强大的窗口停靠浮动
  • 高频面试题(含笔试高频算法整理)基本总结回顾25
  • JavaScript入门【1】概述
  • Java泛型详解
  • Uniapp、Flutter 和 React Native 全面对比
  • flutter 配置 安卓、Ios启动图
  • JavaScript【7】BOM模型
  • IDEA反斜杠路径不会显示JUnit运行的工作目录配置问题
  • 复原展出孙吴大墓,江苏首座考古博物馆将开放
  • 陕西省安康市汉阴县县长陈永乐已任汉阴县委书记
  • 金正恩观摩朝鲜人民军各兵种战术综合训练
  • 英媒:英国首相住所起火,目前无人伤亡
  • 左娅︱悼陈昊
  • 上海与世界|环城生态公园带是上海绿色发展新名片