Threadloal 的原理:
ThreadLocal:为共享变量在每个线程中创建一个副本,每个线程都可以访问自己
内部的副本变量。通过 threadlocal 保证线程的安全性。
其实在 ThreadLocal 类中有一个静态内部类 ThreadLocalMap(其类似于 Map),
用键值对的形式存储每一个线程的变量副本,ThreadLocalMap 中元素的 key 为当前
ThreadLocal 对象,而 value 对应线程的变量副本。
ThreadLocal 本身并不存储值,它只是作为一个 key 保存到 ThreadLocalMap
中,但是这里要注意的是它作为一个 key 用的是弱引用,因为没有强引用链,弱引用在 GC
的时候可能会被回收。这样就会在 ThreadLocalMap 中存在一些 key 为 null 的键值对
(Entry)。因为 key 变成 null 了,我们是没法访问这些 Entry 的,但是这些 Entry 本身是
不会被清除的。如果没有手动删除对应 key 就会导致这块内存即不会回收也无法访问,也
就是内存泄漏。
使用完 ThreadLocal 之后,记得调用 remove 方法。 在不使用线程池的前提下,
即使不调用 remove 方法,线程的"变量副本"也会被 gc 回收,即不会造成内存泄漏的情况。