困难 · 高频 5/5
ThreadLocal 的原理和内存泄漏风险是什么?
ThreadLocal 把变量副本存在线程自己的 ThreadLocalMap 中,线程复用时如果没有 remove,value 可能长期挂在线程上造成内存泄漏。
简短答案
ThreadLocal 把变量副本存在线程自己的 ThreadLocalMap 中,线程复用时如果没有 remove,value 可能长期挂在线程上造成内存泄漏。
详细解析
每个线程都有 ThreadLocalMap,key 是 ThreadLocal 的弱引用,value 是业务对象。线程池中的线程生命周期很长,如果 key 被回收但 value 没清理,就可能产生脏数据或内存占用。
面试回答模板
我会说明 ThreadLocal 解决的是线程内隔离,不是跨线程共享。它的数据实际存在 Thread 对象里。在线程池场景用完必须 remove,避免复用线程时读到旧数据或造成 value 长期无法释放。
易错点
- 只背结论,不解释原理和边界。
- 忽略真实生产环境中的容量、延迟、一致性和失败重试。
- 没有结合项目经验说明为什么这样设计。
常见追问
- 这个方案在高并发下有什么风险?
- 如果数据规模扩大十倍,你会如何调整?
- 线上出现异常时,你会先看哪些指标?