从源码角度理解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的关系图,方便读者理解。在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44998067/article/details/115046880
今日推荐