网上看到很多ThreadLocal的文章,感觉上来就开始讲原理,根本不讲这是个啥。当然可能他们都知道这是个什么东西,用在什么场景下,为什么需要它出现;而我不知道……

 

ThradLocal是什么

还是借用别人的说法:

(1)ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不同的变量值完成操作的场景。

(2)ThreadLocal类似“人手一支笔”,分别写自己的东西,互不干扰;但是所有线程写的名字是一样的。

为什么需要ThreadLocal

我理解应该是有两个需求:

(1)同一个线程中上下文之间数据共享

(2)不同线程之间数据隔离

首先,如果想要实现一个线程中上下文之间数据共享,那么设置一个全局变量就可以了。局部变量绝对是不行的,无法做到全局共享。

但是,如果要做到不同线程之间还要数据隔离,这个就有点难了。本身是全局变量,多个线程是有可能会访问同一个变量的,这个时候ThreadLocal的功能就出来了。本身ThreadLocal这个变量是全局共享变量,各个线程都可以访问到;但是,不同线程get到的value却是不一样的,这就做到了隔离。很好的思路!

使用场景,参考文章

 

ThreadLocal的原理

这个时候开始讲TheadLocal的原理才是合理的。

网上已经有很多文章写的很好了,我就不重复了。记录一篇比较好的文章

当然也有些文章写的有问题,比如

(1)ThreadLocal维护了一个线程安全的map。

这是纯扯淡……  map是Thread的成员变量,每个线程维护了一个map,key是ThreadLocal对象,value是值。