ThreadLocal个人理解

    为了加深理解,将最近对ThreadLocal的了解和源码分析记录总结一下。

 

    ThreadLocal可以为线程提供局部变量。使用ThreadLocal的get()方法,可以在当前线程能够访问的类和方法中,得与当前线程相关联的变量值。

不过,线程局部变量并不是由ThreadLocal对象保存维护的,而是保存在相关联的线程中。ThreadLocal对象只是作为一个key,为当前线程提供了

查找局部变量的线索。也就是说,不同的线程,以相同的ThreadLocal对象作为key,可以查找到相关联的变量值。

 

下面是ThreadLocal源码:

 

以上代码用于生成与每个ThreadLocal对象的key,key值存放在threadLocalHashCode变量中。AtomicInteger类保证了线程安全。

 

将当前ThreadLocal对象作为key值,而将与当前线程相关联的变量值作为value,存放在一个map中。

 

该map保存在当前线程的threadLocals变量中。这个map保存了所有的和该线程关联的局部变量。

 

当需要与当前线程相关联的局部变量时,用get()方法取出。从当前线程的threadLocals中取出局部变量map,以当前ThreadLocal为key进行查找。

 

ThreadLocalMap是ThreadLocal的一个内部类,为局部变量的存储提供数据结构。在ThreadLocalMap内部,数据存储是由一个继承了WeakReference<ThreadLocal>类的Entry类型的数组来实现的,该数组以table作为其变量名。弱引用保证了在table过大的时候,可以将过于陈旧(stale)的Entry回收,而不是报出OutOfMemoryException。并且,ThreadLocalMap提供了一套算法,可以根据当前ThreadLocal对象的threadLocalHashCode值,快速的在table数组中定位。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值