虚引用(WeakReference)
在开始之前,需要区分 Java 引用中的强、软、弱、虚引用,ThreadLocal 使用了弱引用,它是问题的关键。
只有弱引用指向的对象,只要进行 GC 时便会被清除。
ThreadLocal 内存模型
每个线程自己保存一个 Map,即 ThreadLocalMap,这个 Map 以 ThreadLocal 对象为键,且 ThreadLocalMap 的 Entry 继承了 WeakReference 类,是一个对 ThreadLocal 对象的弱引用,源码如下(ThreadLocal.ThreadLocalMap.Entry)。
使用 ThreadLocal 时容易产生一种感觉,即我们保存的数据似乎保存在 ThreadLocal 对象上,实际上它们保存在当前的 Thread 对象上。ThreadLocal 只是提供了一个操作的框架。
ThreadLocal 内存泄漏原理
如果我们在线程中使用 ThreadLocal 不当,将会导致保存的数据无法被回收,过程如下: