ThreadLocal解析

8 篇文章 0 订阅
8 篇文章 0 订阅
ThreadLocal的作用

ThreadLocal常用来保存线程的私有数据,用它来完成线程之间的数据隔离,达到数据同步安全的目的,线程利用ThreadLocal来保存一份数据副本在其内部。下面我们就来分析下ThreadLocal的内部实现原理。

关键类
  • ThreadLocal$ThreadLocalMap
    • ThreadLocal的内部类,其内部用一个Entry[]数组,来描述和封装一个存储ThreadLocalMap$Entry 的散列表,是散列表的话,那肯定有散列冲突,和散列函数。
      • 散列冲突:这里用来解决散列冲突的方法是开放地址线性探测的方式。可以在ThreadLocalMap的set(value)函数中体现出来。
      • 散列函数:这里的散列函数是通过ThreadLocal对象取hashCode然后对散列数组的长度取模映射到数组下标。
  • ThreadLocalMap$Entry
    • 用来保存键值对信息的,key=ThreadLocal对象 value=要保存的值,其中Entry继承了WeakReference,所以entry.get()是有可能==null,当entry.get()==null时,说明这个key值对应的散列表位置中的元素已经没被引用了,所以此时这个元素在新元素插入的时候冲突探测到这个位置时,可以直接替换掉他。ThreadLocalMap set()方法中有体现。
Thread是怎么利用ThreadLocal来实现本地变量的保存的?
  • 1、Thread类中持有了一个ThreadLocalMap成员变量。
  • 2、每次ThreadLocal 调用set(value) 或者get()方法的时候,在方法内部都会拿当前线程的引用对象。
  • 3、2中获取到Thread引用对象之后,然后再拿到1中说的ThreadLocalMap引用对象。这个对象在Thread对象创建的时候就已经被创建好了。后面所有的操作都是基于这个ThreadLocalMap散列表。
  • 4、所以最终ThreadLocal所有的操作都会转化成对当前线程有效的操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值