通常ThreadLocalMap的生命周期跟Thread(注意线程池中的Thread)一样长 , 如果没有手动删除对应key(线程使用结束归还给线程池了 , 其中的KV不再被使用但又不会GC回收 , 可认为是内存泄漏) , 一定会导致内存泄漏 , 但是使用弱引用可以多一层保障:弱引用ThreadLocal会被GC回收 , 不会内存泄漏 , 对应的value在下一次ThreadLocalMap调用set,get,remove的时候会被清除 , Java8已经做了上面的代码优化 。
总结
- 每个ThreadLocal只能保存一个变量副本 , 如果想要一个线程能够保存多个副本以上 , 就需要创建多个ThreadLocal 。
- ThreadLocal内部的ThreadLocalMap键为弱引用 , 会有内存泄漏的风险 。
- 每次使用完ThreadLocal , 都调用它的remove()方法 , 清除数据 。
推荐阅读
- 阿里的垃圾怎么回收?Java G1源码分析与调优手册
- Spring 源码第一篇开整!配置文件是怎么加载的?
- Redis如何清除过期key? 一篇文章带你走近源码!
- 花茶未来市场探析,花茶的感官鉴赏
- Window环境下编译Flink1.10源码
- Java自动化办公OA管理系统源码
- 从源码层,拆解OracleJDK和OpenJDK有什么区别?
- Linux 安装mysql5.7.29源码安装
- redis各类型数据结构和底层实现源码分析
- 中国茶叶之品牌及渠道构建密码探析