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

ThreadLocal原理及其内存泄漏

        ThreadLocal通过为每个线程创建一个共享变量的副本来保证各个线程之间变量的访问和修改互不影响。

        ThreadLocal存放的值是线程内共享的,线程间互斥的,主要用于线程内共享数据,避免通过参数传递。

        ThreadLocal有四个方法:

                initialValue:返回此线程局部变量的初始值。

                get:返回此线程局部变量的当前线程副本的值。如果线程第一次调用该方法,则创建并初始化此副本。

                set:将当前线程副本的值设置为指定值。

                remove:移除此线程局部变量的值。

        Thread内部有两个变量,threadLocals和inheritableThreadLocals

        ThreadLocal内部有个静态内部类ThreadLocalMap,而在外部没办法获取到这个类,每次操纵都需要通过ThreadLocal。而这个map里面维护了一个数据结构为Entry的数组,key就是ThreadLocal,value就是ThreadLocal的value;,而且这个引用还是个弱引用;具体节点类型如下

        所以当系统中存在多个线程的时候,具体的引用是这个样子的(手头画图工具太难用,手快一些,将就看吧):

        首先最上面一条引用线路,threadLocal对象,这是个弱引用如果没有其他引用这个就会被回收。

        但是,下面两条引用都是强引用,进行GC的时候进行标记,只要线程不消亡threadlocal还是可达的;

        如果是不用线程池的话,这里随着线程的消亡,下面两个引用也就没了,GC就会回收掉该片区域,但是现住基本上线程都是在线程池里的,如果一个线程会一直活跃不会消亡,在这种情况下,如果在生命周期结束的时候没有去显式的的清理变量(在线程任务完成时调用ThreadLocal的remove方方法),那线程内部的引用会依然存在,虽然这时候threadlocal已经是null了,但是对应的value依然存在,这时候线程内部里的threadlocalmap里就会存在一个key为null的Entry,因为key是null,所有这块数据永远都不会被访问的,这就是内存泄漏了。


http://www.kler.cn/a/394046.html

相关文章:

  • C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
  • Mac intel 安装IDEA激活时遇到问题 jetbrains.vmoptions.plist: Permission denied
  • Elasticsearch 实战应用:高效搜索与数据分析
  • C获取程序名称的方法
  • Appium配置2024.11.12
  • 网页版五子棋——对战模块(服务器端开发②)
  • AI云产品,缺运维技术指南
  • 区块链智能合约开发:全面解析与实践指南
  • 在使用ipc通信时 ,在渲染进程的Vue + TypeScript 开发过程,给window对象添加属性并赋值时,发生报错解决方法
  • docker打包nginx版wordpress
  • Spring Boot基础教学:开发工具和环境
  • swoole mysql连接池使用
  • 网络安全web基础_HTML基础(扫盲篇)
  • 如何抓住鸿蒙生态崛起的机遇,解决开发挑战,创造更好的应用体验?
  • 不仅能够实现前后场的简单互动,而且能够实现人机结合,最终实现整个巡检流程的标准化的智慧园区开源了
  • 985研一学习日记 - 2024.11.14
  • windows和linux行尾序列CRLF和LF切换问题
  • k8s服务内容滚动升级以及常用命令介绍
  • 【K8S系列】如何监控集群CPU使用率并设置告警的分析与详细解决方案
  • 云服务器安装mysql8.0(阿里云或者腾讯云都可以)
  • 【论文复现】基于标签相关性的多标签学习
  • Make Selinux Enforce Again
  • 大语言模型理论基础
  • 禁止 Kindeditor富文本粘贴图片和html格式
  • 基于海思soc的智能产品开发(两个图像处理来源)
  • 前端:块级元素和行内元素