ThreadLocal详解

简介: ThreadLocal详解

ThreadLocal是什么

线程本地变量。当使用 ThreadLocal 维护变量时, ThreadLocal 为每个使用该变量的线程提供独立的 变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程。

ThreadLocal原理

每个线程都有一个 ThreadLocalMap ( ThreadLocal 内部类),Map中元素的键为 ThreadLocal ,而 值对应线程的变量副本。

image.png

调用 threadLocal.set() -->调用 getMap(Thread) -->返回当前线程的 ThreadLocalMap --> map.set(this, value) ,this是 threadLocal 本身。源码如下

publicvoidset(Tvalue) {
Threadt=Thread.currentThread();
ThreadLocalMapmap=getMap(t);
if (map!=null)
map.set(this, value);
elsecreateMap(t, value);
}
ThreadLocalMapgetMap(Threadt) {
returnt.threadLocals;
}
voidcreateMap(Threadt, TfirstValue) {
t.threadLocals=newThreadLocalMap(this, firstValue);
}

调用 get() -->调用 getMap(Thread) -->返回当前线程的 ThreadLocalMap -- > map.getEntry(this) ,返回 value 。源码如下:

publicTget() {
Threadt=Thread.currentThread();
ThreadLocalMapmap=getMap(t);
if (map!=null) {
ThreadLocalMap.Entrye=map.getEntry(this);
if (e!=null) {
@SuppressWarnings("unchecked")
Tresult= (T)e.value;
returnresult;
        }
    }
returnsetInitialValue();
}

threadLocals 的类型 ThreadLocalMap 的键为 ThreadLocal 对象,因为每个线程中可有多个 threadLocal 变量,如 longLocal 和 stringLocal 。

publicclassThreadLocalDemo {
ThreadLocal<Long>longLocal=newThreadLocal<>();
publicvoidset() {
longLocal.set(Thread.currentThread().getId());
    }
publicLongget() {
returnlongLocal.get();
    }
publicstaticvoidmain(String[] args) throwsInterruptedException {
ThreadLocalDemothreadLocalDemo=newThreadLocalDemo();
threadLocalDemo.set();
System.out.println(threadLocalDemo.get());
Threadthread=newThread(() -> {
threadLocalDemo.set();
System.out.println(threadLocalDemo.get());
        });
thread.start();
thread.join();
System.out.println(threadLocalDemo.get());
    }
}

ThreadLocal 并不是用来解决共享资源的多线程访问问题,因为每个线程中的资源只是副本,不会共 享。因此 ThreadLocal 适合作为线程上下文变量,简化线程内传参

ThreadLocal内存泄漏的原因?

每个线程都有⼀个 ThreadLocalMap 的内部属性,map的key是 ThreaLocal ,定义为弱引用,value是 强引用类型。垃圾回收的时候会⾃动回收key,而value的回收取决于Thread对象的生命周期。一般会通 过线程池的方式复用线程节省资源,这也就导致了线程对象的生命周期比较长,这样便一直存在一条强 引用链的关系: Thread --> ThreadLocalMap --> Entry --> Value ,随着任务的执行,value就有可能 越来越多且无法释放,最终导致内存泄漏。

解决⽅法:每次使⽤完 ThreadLocal 就调⽤它的 remove() ⽅法,手动将对应的键值对删除,从⽽避免 内存泄漏。

ThreadLocal使用场景有哪些?

ThreadLocal 适用场景:每个线程需要有自己单独的实例,且需要在多个方法中共享实例,即同时满足 实例在线程间的隔离与方法间的共享,这种情况适合使用 ThreadLocal 。比如Java web应用中,每个线 程有自己单独的 Session 实例,就可以使用 ThreadLocal 来实现。

相关文章
|
机器学习/深度学习 数据建模 数据挖掘
数据建模是什么意思?如何进行数据建模?
数据建模是什么意思?如何进行数据建模?
719 2
|
7月前
|
存储 调度 开发者
HarmonyOS Next 实战卡片开发 03
本文详细介绍了基于 HarmonyOS Next 的卡片开发实战,涵盖从项目创建到功能实现的全流程。首先通过新建项目和服务卡片搭建基础框架,并设置沉浸式体验优化界面。接着实现了首页轮播图功能,包括申请网络权限、初始化数据和构建轮播组件。随后深入讲解了卡片 id 的处理,涉及获取、返回、持久化存储及移除操作,确保卡片与应用间的高效通信。此外,封装了下载图片工具类,支持卡片发起通知获取网络图片,增强功能扩展性。最后实现了卡片同步轮播功能,使首页与卡片轮播状态保持一致。整个流程注重细节,结合实际案例,为开发者提供了全面的参考。
217 20
HarmonyOS Next 实战卡片开发 03
|
8月前
|
人工智能 自然语言处理 搜索推荐
小米实测:Deepseek——你的私人旅游攻略定制专家!
大家好,我是小米,一个31岁的技术爱好者。今天分享如何用Deepseek规划完美旅行。Deepseek能快速整合信息、提供个性化推荐,省时省力,并支持实时问答。从目的地选择到行程规划,再到预订机票住宿和旅行中的实时帮助,它都能提供强大支持。希望今天的分享能帮到你,期待你用Deepseek规划出属于自己的精彩旅程!如果你觉得有用,欢迎点赞、转发并关注我的微信公众号“软件求生”,获取更多技术干货。
665 8
|
9月前
|
存储 供应链 监控
反向海淘中下单、支付方式、订单、库存管理、物流与配送
反向海淘指海外消费者通过跨境电商平台购买中国商品。其流程包括:1) 海外消费者在支持多语言和货币的平台上选品、加入购物车并填写准确收货信息下单;2) 支付方式涵盖国际信用卡、第三方支付平台(如PayPal)、本地支付及电子钱包;3) 订单管理涉及订单确认、拣货包装、发货跟踪及售后处理,并通过数据分析优化库存与销售;4) 库存管理强调实时监控、多渠道同步、预警补货及滞销处理;5) 物流方案提供国际快递、邮政包裹、专线物流和海外仓等多种选择,确保全程跟踪和清关服务。
|
11月前
|
传感器 前端开发 Android开发
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求。本文深入探讨了插件开发的基本概念、流程、集成方法、常见类型及开发实例,如相机插件的开发步骤,同时强调了版本兼容性、性能优化等注意事项,并展望了插件开发的未来趋势。
296 2
|
数据采集 Python
如何用Python Selenium和WebDriver抓取LinkedIn数据并保存登录状态
本文介绍了使用Python Selenium和WebDriver库抓取LinkedIn数据的方法。首先,安装Selenium库和对应的WebDriver,然后配置爬虫代理IP以避免频繁请求被检测。接下来,设置user-agent和cookies以模拟真实用户行为,实现登录并保持状态。登录后,使用WebDriver抓取目标页面数据,如用户名、年龄、性别和简历信息。最后,强调了优化代码、处理异常和遵守使用条款的重要性,以提高效率并避免账号被封禁。
424 2
如何用Python Selenium和WebDriver抓取LinkedIn数据并保存登录状态
|
机器学习/深度学习 Web App开发 人工智能
自治代理(Autonomous Agent)
自治代理(Autonomous Agent)是指具备自主决策和行动能力的智能体,能够在给定的环境中自主地感知、学习和做出决策,以实现特定的目标。自治代理能够根据环境的变化和反馈信息,不断地适应和改进自己的行为,从而实现更好的性能和效果。
662 3
|
JavaScript 前端开发
什么是原型链?
什么是原型链?
381 0
|
算法 异构计算
基于FPGA的FSK调制解调通信系统verilog实现,包含testbench
基于FPGA的FSK调制解调通信系统verilog实现,包含testbench
584 3
|
存储 弹性计算 运维
阿里云无影云电脑具体价格
阿里云无影云电脑具体价格可以免费使用3个月
415 0