网上看到很多ThreadLocal的文章,感觉上来就开始讲原理,根本不讲这是个啥。当然可能他们都知道这是个什么东西,用在什么场景下,为什么需要它出现;而我不知道……
ThradLocal是什么
还是借用别人的说法:
(1)ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不同的变量值完成操作的场景。
(2)ThreadLocal类似“人手一支笔”,分别写自己的东西,互不干扰;但是所有线程写的名字是一样的。
为什么需要ThreadLocal
我理解应该是有两个需求:
(1)同一个线程中上下文之间数据共享
(2)不同线程之间数据隔离
首先,如果想要实现一个线程中上下文之间数据共享,那么设置一个全局变量就可以了。局部变量绝对是不行的,无法做到全局共享。
但是,如果要做到不同线程之间还要数据隔离,这个就有点难了。本身是全局变量,多个线程是有可能会访问同一个变量的,这个时候ThreadLocal的功能就出来了。本身ThreadLocal这个变量是全局共享变量,各个线程都可以访问到;但是,不同线程get到的value却是不一样的,这就做到了隔离。很好的思路!
使用场景,参考文章https://segmentfault.com/a/1190000019952281
ThreadLocal的原理
这个时候开始讲TheadLocal的原理才是合理的。
网上已经有很多文章写的很好了,我就不重复了。记录一篇比较好的文章https://www.jianshu.com/p/98b68c97df9b
当然也有些文章写的有问题,比如
(1)ThreadLocal维护了一个线程安全的map。
这是纯扯淡…… map是Thread的成员变量,每个线程维护了一个map,key是ThreadLocal对象,value是值。