对于ThreadLocal的原理不了解或者连Java中的引用类型都不了解的可以看一下我的之前的一篇文章Java中的引用和ThreadLocal_鱼跃鹰飞的博客-CSDN博客
我这里也简单总结一下:
1. 每个Thread里都存储着一个成员变量,ThreadLocalMap
2. ThreadLocal本身不存储数据,像是一个工具类,基于ThreadLocal去操作ThreadLocalMap
3.ThreadLocalMap本身就是基于Entry[]实现的,因为一个线程可以绑定多个ThreadLocal,这样一来,可能需要存储多个数据,所以采用Entry[]的形式实现
4.每一个线程都有自己的ThreadLocalMap,再基于ThreadLocal对象本身作为key,对value进行存取.
5.ThreadLocalMap的key是一个弱引用,弱引用的特点是:GC回收时,一定会被回收。这里使用弱引用是为了在ThreadLocal对象失去引用之后能被回收,如果是强引用,会导致ThreadLocal对象无法被回收
关于ThreadLocal的内存泄漏问题我们可以通过两个方面进行讨论
我们先看一下ThreadLocal的原理图
1. key的内存泄漏
key的是ThreadLocal对象,因为是弱引用,GC的时候就可以被回收掉,所以key的内存泄漏问题通过弱引用的设计就解决了。
2. value的内存泄漏问题
这是我们实际工作中可能面临的问题,如果ThreadLocal对象因为GC被回收了,也就是对应的key失去了引用,变成了null,那value也就无法访问了,如果我们使用的是new出来的线程,等线程执行结束了也就会被整体回收掉了,但是如果使用的是线程池那线程的空间就不会被回收,所以需要自己在使用完ThreadLocal对象后及时调用remove方法,移除Entry即可。这个是面试中关于ThreadLocal的主要考点