ThreadLocal分析总结:

本文详细介绍了ThreadLocal的工作原理,包括其内部数据结构ThreadLocalMap、Entry数组存储方式、hash冲突解决策略(线性探测)、内存泄漏风险及预防措施。同时,文章强调了ThreadLocal在多线程环境下存储线程局部变量的独特作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 1、ThreadLocal 是什么
    • 它是一个数据结构,像 HashMap,可保存 "key : value" 键值对;
      ThreadLocal 有一个内部类ThreadLocalMap,用于存储数据。
    • 但一个 ThreadLocal 只能保存一个,并且各个线程的数据互不干扰。
  • 2、ThreadLocalMap
    • 在 ThreadLoalMap 中,初始化一个大小 16 的 Entry 数组;
    • Entry 对象用来保存每一个 key-value 键值对,只不过这里的 key 永远都是 ThreadLocal 对象;
    • 通过 ThreadLocal 对象的 set 方法,结果把 ThreadLocal 对象自己当做 key,放进了 ThreadLoalMap 中。
  • 3、hash冲突解决:
    • 线性探测,步长加 1 或减 1。代码是在set和getEntry方法中(nextIndex方法)
  • 4、内存泄漏?
    • 产生原理?
      • ThreadLocalMap中的key是ThreadLocalMap自己,是弱引用。
        见代码实现,Entry extends了WeakReference,还在代码中调用super方法,将key设置为弱引用。
      • ThreadLocal 在没有外部对象强引用时,发生 GC 时弱引用 Key 会被回收,而 Value 不会回收,如果创建 ThreadLocal 的线程一直持续运行,那么这个 Entry 对象中的 value 就有可能一直得不到回收,发生内存泄露。
    • 解决:
      • 使用完 ThreadLocal 之后,显示调用 remove 方法。将 Entry 节点和 Map 的引用关系移除,这样整个 Entry 对象在 GC Roots 分析后就变成不可达了,下次 GC 时就可以被回收。
        注:要是renove之后还要使用怎么办?
  • 5、总说明:
    • 1、Thread里定义的对象是ThreadLocal.ThreadLocalMap,不是ThreadLocal。
    • 2、每个线程中调用ThreadLocal的get和set方法,实际是对当前Thread里的ThreadLocalMap进行操作
    • 3、每个线程里可以新建多个ThreadLocal,每次调用时set值,用该ThreadLocal作为key。
      • 每个 ThreadLocal 对象都有一个 hash 值 threadLocalHashCode,每初始化一个 ThreadLocal 对象,hash 值就增加一个固定的大小 0x61c88647。
      • 底层原理和hashMap很像,根据哈希值寻找数组索引,然后取值和设置值。
    • 4、ThreadLocalMap内部是用Entry 数组存储数据。
  • 6、参考:
 
 
 
 

转载于:https://www.cnblogs.com/buwuliao/p/10648215.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值