1、ThreadLocal 是什么 ?有什么用 ?
为本地线程生成共享变量副本的工具类。CopyValueIntoEveryThread
主要作用:同一线程中做到跨类,跨方法传递数据,而不用传递参数和依靠返回值。
具体实现:
- 定义全局的
ThreadLocal对象
,变量记作tl
- 共享变量
- 线程内调用
tl
的方法,tl
会为当前线程创建ThreadLocalMap对象
(如果不存在),变量记作map
map
创建Entry对象
,存储键值对,key
是tl变量副本
value
是初始化值(shared副本
)
每个线程创建自己的
ThreadLocalMap
相互不干扰,而又共享了 全局变量
2、Thread Local 副作用
会产生内存泄露
tl
强引用指向 ThreadLocal实例对象
,map
的Entry
的key
(记作t1变量副本
)弱引用指向 ThreadLocal实例对象
- 当
t1
的指向断开,如果t1变量副本
还是强引用,ThreadLocal实例对象
,无法回收,会造成内存泄漏。 - 使用 弱引用 还可能造成内存泄漏,即使
key==null
,Entry对象
还存在,value没有被回收,造成内存泄漏,每次都要 remove,清除Entry