浅谈Thread实现ThreadLocal原理

一、简介

在java多线程场景中,ThreadLocal是一个比较重要的点。它可以使线程拥有独立的变量副本,使得每个线程对各自的变量副本的操作是独立的、互不影响的,也就是说,每个线程的Thread Local变量是自己专用的,其他线程是访问不到的。当然,这些变量副本也只在线程的生命周期内起作用。

二、实现原理

为了方便大家理解,先给大家看下我们下面要讲解的几个类之间的关系图,如图1所示:

2.1 涉及到的类型简介

(1) ThreadLocalMap类:该类是Thread Local类的静态内部类,该类中有一个数组类型的变量table。table中存放的元素为Entry类型的。

(2) Entry类:该类是ThreadLocalMap类中的静态内部类,该类的父类为WeakReference类。该类的具有一个有两个参数的构造函数,两个参数分别为ThreadLocal<?>类型的参数k和Object类型的参数v。

(3) Thread类:这个就是我们常说的线程类,因为今天的重点不是它,所以我们也不在此处进行过多的阐述了。我们主要来看一下该类中的一个变量threadLocals,这个变量是Thread Local.ThreadLocalMap类型的。因此该变量中带有一个Entry[] 类型的变量table。

2.2 实现原理讲解

看到这里,相信许多小伙伴们已经大概了解了,Thread是如何实现ThreadLocal了吧。那么就让我们一起来缕一缕吧。

通过上面的基础,我们知道了每一个Thread对象都会有一个ThreadLocal.ThreadLocalMap类型的变量thradLocals,而ThreadLocal.ThreadLocalMap类型有一个存放Entry类型的数组变量table。又因为Entry类型又是一种与HashMap相类似的K-V(键-值)类的数据结构。其中的K的类型就是ThreadLocal,而V的类型是Object类,也就是每个线程要存放的变量副本。

三、总结

由于时间有限,本文并没有对ThreadLocal类的源码进行分析,建议感兴趣的朋友们可以去看下ThreadLocal类的源码,那样对这个原理的理解以及自身的进步会有更大的帮助。由于本人能力有限,若文中又错误的地方,还请读者们不吝赐教。另外,有兴趣的朋友们自己可以去了解下ThreadLocal类的子类InheritableThreadLocal类的一些用法,以及如何将Thread和线程池结合起来使用。若有时间的话,到时鄙人也会将这部分内容补充起来。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值