有关ThreadLocal的内存泄漏简单理解
ThreadLocal
ThreadLocal没什么神秘的,他就是每个线程私有的一个变量而已。
每个线程都包含一个ThreadLocalMap类型的成员变量,该Map的每个Entry中,key-value的关系就是ThreadLocal-value的关系
ThreadLocal提供了get和set方法
当使用Set方法的时候,ThreadLocal会获取当前线程的对象,然后获取当前线程的ThreadLocalMap对象,然后再去以当前的ThreadLocal作为key去set一个值
当使用get方法的时候,ThreadLocal会获取当前的线程对象,然后获取当前线程的ThreadLocalMap对象,最后再用当前的ThreadLocal作为key去获取一个值
弱引用
Entry中的key是持有的对ThreadLocal的弱引用,也就是每一次GC的时候ThreadLocal在不存在强引用的关系下就会被回收♻️,但是Entry中的value却不会被回收♻️
所以每次使用完ThreadLocal的时候,需要再调用一下get/set/remove方法,都可以自动清除这个遗留的value
为何不是强引用
如果使用强引用的话,这个ThreadLocal对象永远不会被回收的,因为Entry中key是持有的ThreadLocal的强引用,只有在remove之后ThreadLocal才有可能被回收,否则的话容易造成OOM