知识卡片

ThreadLocal隔离

普通读书笔记卡 · 1505

内容

ThreadLocal 把共享变量变成”线程局部副本”:数据只属于当前线程,避免加锁开销,适合数据库连接、会话等场景。但它不会自动消失——ThreadLocalMap 的 Entry 只有 Key 是弱引用,Value 仍是强引用;线程池里 Thread 长期存活,不触发 get/set/remove 就不清理,会造成内存泄漏。用完必须显式 remove(),避免旧任务数据污染新任务。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第1章《多线程原理与实战》1.8.2节《ThreadLocal的使用场景》、1.8.7节《ThreadLocalMap源码分析》(源文件:_epub-src/OEBPS/Text/chapter50.xhtml、chapter55.xhtml) - 结论依据:原文说明 ThreadLocal 的主要价值是线程隔离与跨函数传递数据,并单独指出“线程长时间运行而没有被销毁,线程池中的Thread实例很容易满足此条件”是内存泄漏的前提之一,进而要求“使用完成之后务必调用remove()方法”,因此推出本卡结论。 - 原始内容:ThreadLocal的主要价值在于线程隔离,ThreadLocal中的数据只属于当前线程……常见的ThreadLocal使用场景为数据库连接独享、Session数据管理等……线程长时间运行而没有被销毁。线程池中的Thread实例很容易满足此条件……ThreadLocal使用完成之后务必调用remove()方法。这是简单、有效地避免ThreadLocal引发内存泄漏问题的方法。