当前位置: 首页 > news >正文

ThreadLocal实现原理

ThreadLocal 是 Java 中实现线程封闭(Thread Confinement)的核心机制,它通过为每个线程创建变量的独立副本来解决多线程环境下的线程安全问题。 

Thread
└── ThreadLocalMap (threadLocals)  // 每个线程持有的专属Map├── Entry[] table              // 哈希表结构│   └── Entry extends WeakReference<ThreadLocal<?>>│       ├── ThreadLocal<?> key  // 弱引用Key│       └── Object value       // 强引用Value└── 其他HashMap类似字段

threadlocal里的数据是怎么存储的?

每个线程内部有一个专属、私有的ThreadLocalMap(就是一个hashMap,底层用Entry数组存数据)

value:要保存的资源

调用set方法时,就是以当前ThreadLocal对象为key,以资源为value,放到ThreadLocalMap中

调用get方法时,就是以当前ThreadLocal对象为key,从ThreadLocalMap中取value

开发中一般把ThreadLocal声明为static,这样ThreadLocal对象是线程共享的,那key都共享了,不同线程取出来的value不就是同一个吗?

并不是。ThreadLocalMap是每个线程私有的

[正确模型]
static ThreadLocal实例(作为Key)
├── 线程1的ThreadLocalMap: Entry(Key=ThreadLocal实例 → ValueA)
├── 线程2的ThreadLocalMap: Entry(Key=ThreadLocal实例 → ValueB)
└── 线程3的ThreadLocalMap: Entry(Key=ThreadLocal实例 → ValueC)

为什么key是弱应用?

要避免key的内存泄露问题

情况1:new Thread()的情况,用完正常销毁,那么ThreadLocalMap会被GC正常回收,不会出现内存泄露。

情况2:使用线程池结合ThreadLocal的情况(这个使用更常见,不需要频繁创建,可以复用),线程池中的线程不会销毁会一致复用。

弱引用Key,GC时ThreadLocal无强引用,回收Key防止Map持续增长

key只有弱引用时,只要发生了垃圾回收,ThreadLocalMap就会回收,避免内存泄露问题


ThreadLocalMap中如何清理大量为null的数据 ?

在调用set、get、remove方法时,就会遍历数组,清除为null的entry,然后通过线性探测重新处理hash冲突

为什么value是强引用?

将数据存到value中,是为了要用它,如果不是强引用,就会被GC回收

那value怎么回收呢?

不回收会导致内存泄露

所以,在使用完ThreadLocal后必须断开强引用,即调用remove方法手动断开强引用,让gc把它回收了

http://www.xdnf.cn/news/977509.html

相关文章:

  • SpringBoot前后台交互 -- 登录功能实现(拦截器+异常捕获器)
  • 音频导入规范
  • 大模型实战篇之ChatGPT(国内可以用)一、实现连续对话智能体
  • 【Linux shell】条件判断和流程控制
  • DL00124-基于YOLOv12深度学习的棉花叶片病害检测含完整数据集
  • BERT 模型微调与传统机器学习的对比
  • uniapp音乐播放createInnerAudioContext
  • 零基础实战:云开发家政维修小程序搭建指南
  • UniApp组件封装,2025年最新HarmonyOS鸿蒙模块化开发项目式教程
  • vue3 + element plus 实现表格列头、行的添加及拖动换位
  • vue前端面试题——记录一次面试当中遇到的题(1)
  • element-ui 的el-table,多选翻页后,之前选择的数据丢失问题处理
  • 黑马教程强化day2-1
  • JAVA毕业设计227—基于SpringBoot+hadoop+spark+Vue的大数据房屋维修系统(源代码+数据库)
  • Linux 文件内容的查询与统计
  • xilinx的gt的ALIGN_COMMA_WORD设置的作用
  • UE5 学习系列(五)导入贴图资产
  • 纯血Harmony NETX 5小游戏实践:2048(附源文件)
  • vuetify、nuxt报错lh.at is not a functionlh.at‘ is undefined
  • R语言 | 如何使用R书写html文档?
  • 打造超轻量的仿chatgpt的AI聊天应用
  • IDEA 连接 Docker 一键打镜像
  • LHM深度技术解析:基于多模态Transformer的单图秒级可动画3D人体重建模型
  • 2025.06.11【Ribo-seq】|根据注释文件获取外显子及ORF序列
  • Unity基础-Resources资源动态加载
  • 大模型在输尿管上段积脓预测与治疗方案制定中的应用研究
  • 传输层协议TCP(下)
  • AJAX、Axios 与 Fetch:现代前端数据请求技术对比
  • 提升iOS开发效率:通过KeyMob等工具进行全面性能分析与调试
  • 解决windows下pycharm终端conda无法激活虚拟环境问题