ThreadLocal 为什么可能导致内存泄漏?
先自己想一想,再看参考要点
参考要点
- ThreadLocalMap 的 Entry 对 key(ThreadLocal 对象)是弱引用,对 value 是强引用
- ThreadLocal 没有其它强引用时 key 在 GC 后变为 null,value 仍被线程的 Map 引用
- 这样的陈旧条目要等这个线程之后调用 set()、remove() 或 get() 未命中时才可能被清理,不保证及时,static final 的 ThreadLocal 一直强可达,弱引用不起作用
- 复用线程还会让后一个请求读到前一个请求的数据
- 用完在 finally 中调用 remove()