从源码角度理解ThreadLocal的底层实现

ThreadLocal是什么

早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。

当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。

下面博主从源码角度对ThreadLocal的底层原理进行解析。

从源码角度解析ThreadLocal

实际上,每个线程在创建出来时,其内部类中便存在一个ThreadLocalMap,当线程被创建时,ThreadLocalMap被置为null。
在这里插入图片描述ThreadLocalMap即为ThreadLocal的静态内部类,下图为ThreadLocal的源码。
在这里插入图片描述ThreadLocalMap中包含着一个静态内部类Entry以及一个Entry数组,Entry数组中则包含了ThreadLocal和Object的对应关系。

下面结合ThreadLocal的get和set方法来讲解ThreadLocal如何为每个使用该变量的线程提供独立的变量副本。

ThreadLocal的set方法如下图所示。在这里插入图片描述
当我们调用ThreadLocal的set方法时,实际上是取出了当前线程的ThreadLocalMap,然后将该ThreadLocal变量作为Entry的key值,输入的value作为Entry的value传入ThreadLocalMap。在这里插入图片描述
而当我们使用get方法获取值时,同样先是取出调用该方法的线程的ThreadLocalMap,然后将ThreadLocal变量作为key值取出对应的value值。

由于每一个线程内部都含有一个ThreadLocalMap,因此每一个线程利用ThreadLocal作为key值所取出的value值自然不相同了。

文章的最后附上Thread,ThreadLocalMap与ThreadLocal的关系图,方便读者理解。在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值