1、ThreadLocal 的用途
给每个线程提供自己独立的变量副本,实现线程间隔离。
常用于:
- 数据库连接、Session 缓存、用户上下文(如 userId)
- 线程池中的线程复用时避免共享污染;
- 实现线程封闭的设计模式
2、内存泄漏
使用弱引用作为 ThreadLocal 的键可以防止内存泄漏。若 Threadlocal 实例被不再需要的线程持有为强引用,那么当该线程结束时,相关的 ThreadLocal 实例及其对应的数据可能无法被回收,导致内存持续占用。而弱引用允许垃圾回收器在内存不足时回收对象。这样,当没有其他强引用指向某个 Threadlocal 实例时,它可以被及时回收,避免长时间占用内存。
如果使用强引用,可能有人会说那线程被回收之后就好了呀。重点来了!线程在我们应用中,常常是以线程池的方式来使用的,比如 Tomcat 的线程池处理了一堆请求,而线程池中的线程一般是不会被清理掉的,所以这个引用链就会一直在,那么 ThreadLocal对象即使没有用了,也会随着线程的存在,而一直存在着!
所以这条引用链需要弱化一下,而能操作的只有 Entry 和 key 之间的引用,所以它们之间用弱引用来实现。