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
