ThreadLocal 实现原理
每个 Thread 中都存储着一个成员变量:ThreadLocalMap
/** InheritableThreadLocal values pertaining to this thread. This map is* maintained by the InheritableThreadLocal class.*/ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
ThreadLocal 本身不存储数据,像是一个工具类,基于 ThreadLocal 去操作 ThreadLocalMap,
ThreadLocalMap 本身就是基于 Entry[] 实现的,因为一个线程可以绑定多个 ThreadLocal ,这样可以存储多个数据,所以采用Entry[] 的形式实现。
每个线程都有自己独立的 ThreadLocalMap ,再基于 ThreadLocal 对象本身作为key,对value 进行存取,ThreadLocalMap 的 key 是一个弱引用,弱引用的特点是,即便有弱引用,在GC时,也必须被回收。这里是为了在ThreadLocal 对象失去引用后,如果key 的引用是强引用,会导致 ThreadLocal 对象无法被回收。从而引发一个问题:ThreadLocal 会出现内存泄漏。具体分析参考:
ThreadLocal的内存泄露问题_threadlocal内存泄漏原因_小孙的Blog的博客-CSDN博客
解决方法:在使用完ThreadLocal 后,及时调用 remove() 方法,移除 Entry 即可