云时代的 JVM 原理与实战
康杨
京东资深架构师
3111 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
云时代的 JVM 原理与实战
15
15
1.0x
00:00/00:00
登录|注册

27|ThreadLocal(下):ThreadLocal家族成员及应用指南

你好,我是康杨。
通过上节课的学习相信你对 ThreadLocal 已经有了深刻的理解,但是在复杂的现实业务场景中,单靠 ThreadLocal 所能解决的问题是有限的,我们需要通过了解 ThreadLocal 家族的其他成员,以及 ThreadLocal 在实际场景中的各种应用,来进一步提升 ThreadLocal 的战斗力,帮你在现实中解决更加棘手的问题。
接下来就让我们进入 ThreadLocal 的江湖,首先出场的就是 ThreadLocal 家族的 4 个成员。

ThreadLocal 家族

通过上节课的学习,我们知道 ThreadLocal 是在 JDK 1.2 中引入的,解决了一个线程中多个方法间信息传递的问题。在生产环境中,为了提升系统的性能,充分发挥多核 CPU 的优势,我们经常通过增加线程或者异步的方式来更好地发挥底层硬件的性能。

InheritableThreadLocal

在这种情况下,就自然引出了父子线程的问题,也就是如何优雅地把父线程的信息传递给子线程,这显然超出了 ThreadLocal 的能力范围。所以在 JDK 1.3 中,JVM 引入了 InheritableThreadLocal,在创建子线程时将父线程的变量副本复制到子线程中,实现子线程继承父线程的变量副本,从而有效解决父子线程之间参数传递的问题,实现了跨线程的变量传递。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

ThreadLocal 家族成员及应用指南 本文深入介绍了 ThreadLocal 家族的成员及其在实际场景中的应用。首先介绍了 InheritableThreadLocal,它解决了父子线程间参数传递的问题,但在线程池场景下存在局限性。随后介绍了 TransmittableThreadLocal,它是阿里巴巴开源的解决方案,能够在线程池场景下正常访问父线程设置的线程局部变量。最后介绍了 FastThreadLocal,它是 Netty 进行了优化后的产物,需要与 FastThreadLocalThread 结合使用才能发挥作用。 文章还探讨了 ThreadLocal 在实际应用中的场景。其中提到了 ThreadLocal 的作用之一是将非线程安全的类以线程安全的方式使用,比如将 SimpleDateFormat 变量通过 ThreadLocal 封装成线程安全的类。此外,还提到了在 JDK 1.8 以上版本可以直接使用 DateTimeFormatter 代替 SimpleDateFormat,因为它是线程安全的。 总的来说,本文通过介绍 ThreadLocal 家族的成员及其在实际应用中的场景,帮助读者更好地理解了这些技术特点,以及在实际问题中如何合理地应用 ThreadLocal。 此外,文章还提供了一些关于 ThreadLocal 的最佳实践和小技巧,如 ThreadLocal 变量的初始化、将 ThreadLocal 设置为全局变量以提升内存效率,以及在使用后及时删除 ThreadLocal 对象以避免内存泄漏和脏数据问题。同时,还强调了在使用 ThreadLocal 时需要注意性能问题、避免滥用,并注意在跨线程和线程池场景下谨慎使用。 通过本文的总结,读者可以快速了解 ThreadLocal 家族成员的特点和在实际应用中的使用场景,以及避免使用 ThreadLocal 时可能遇到的风险和注意事项。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云时代的 JVM 原理与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • 浩仔是程序员
    那其实threadlocal也没有解决内存泄露的问题,那key设置成弱引用好像也没有太大的作用?请问老师,这么设计可以解决什么问题呢
    2023-10-31归属地:广东
    1
  • peter
    请教老师两个问题: Q1:ThreadLocal是用于线程不同方法之间信息传递吗?我感觉这个说法有问题啊。 Q2:ThreadLocal用于父子线程数据传递,只是创建的时候传递一次吗?创建完毕以后还有数据传递吗?
    2023-10-30归属地:北京
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部