《多线程下ThreadLocal使用场景实例》

简介: 《多线程下ThreadLocal使用场景实例》

在业务开发中,threadLocal有两种业务场景运用较多。


1、threadlocal保证每个线程独享对象,创建本地线程的副本,保证每个线程都拥有属于自己的副本,这样保证线程安全。


2、threadlocal可以作用类似全局变量,在其中一个方法里用set存入数据,其他方法可以用get直接获取,避免了传参,作用到每个线程独立保存信息。


场景一:

image.png


结果:开启了三个线程,因为用了threadlocal,每个线程都有属于自己的本地副本,并不会累加到15,而是n最大输出5。


还有就是simpledateformat也适用于场景一,当线程池开启,提交10000个或者更多任务时,每个线程都创建属于自己的simpledateformat开销会很大,而且占用内存,销毁对象也是有开销的:这种情况下,我们首先想到的是所有线程先共用一个simpledataformate,但他不是线程安全的,如何解决呢,给他加synchrolized锁,这样可以解决,但线程运行的时候,会发生阻塞,非常影响效率,此时此刻threadlocal就是非常好的解决办法。


threadlocal会让每个线程的simpledateformat独立,如果线程池Executors.newFixedThreadPool(15)开启15个线程,则只会创建15个simpledateformat,而且线程安全,相互之前不会影响。


场景二:

image.png


场景二类似于全局变量,免去了传参的麻烦 ,保证方法得到的对象值相同,先将对象存储在localthread里面,然后在获取,最后一定要记得remove掉。


问:线程池中使用threadlocal为什么容易造成内存泄漏?


因为线程池里的线程存活周期太长,往往跟程序的停止才销毁的,这样threadlocal持有的threadlocalmap就一直不会被回收,解决办法,可以手动在finally块调用它的remove()方法

相关文章
|
3月前
|
算法 安全 Java
压缩教程学习,文件压缩包解压推荐,BANDIZIP、win_RAR、7-Zip工作使用教程
压缩教程学习,文件压缩包解压推荐,BANDIZIP、win_RAR、7-Zip工作使用教程
1208 138
|
6月前
|
安全 Java 关系型数据库
nacos 升级指北 草履虫级教程
本文记录了Nacos从2.4.1升级至2.5.1的完整步骤,适用于使用MySQL持久化、JDK8、Linux环境及Jar包部署的情况。内容包括升级前的版本兼容性调查、数据库与配置备份、升级操作流程及回滚方案,确保升级过程安全可控。
|
机器学习/深度学习 数据采集 算法
时间序列结构变化分析:Python实现时间序列变化点检测
在时间序列分析和预测中,准确检测结构变化至关重要。新出现的分布模式往往会导致历史数据失去代表性,进而影响基于这些数据训练的模型的有效性。
1745 1
|
网络虚拟化
工作多年,有多少人还不知道MUX VLAN的?
工作多年,有多少人还不知道MUX VLAN的?
394 0
|
人工智能 自然语言处理 安全
创新场景丨后土“量地”,跨模态大模型让自然资源管理有“速度”更有“温度”
“通过需求引领、底座支撑、数字转型、场景驱动、智慧赋能,全面支撑自然资源数字化治理能力提升,最终答好自然资源数字化治理过程中的必答题。
|
10月前
|
人工智能 算法
中国AI应用排行榜3月榜单发布,「AI四大天王」格局正式形成
2025年3月,中国AI应用排行榜发布!由AIGCRank制作,基于国内主流App市场及算法备案数据筛选200+款代表性AI应用排名。榜单显示夸克、DeepSeek、豆包、腾讯元宝形成“AI四大天王”格局,头部生态壁垒加深。通用助手主导市场,垂类赛道如教育、生成工具等多点开花。报告揭示中国AI市场进入“头部固化+垂类爆发”阶段,未来商业化路径将成为垂类应用突破关键。
2006 0
EMQ
|
Linux 网络性能优化 数据安全/隐私保护
MQTT 5.0 报文解析 01:CONNECT 与 CONNACK
如果我们想要使用 MQTT 进行通信,第一步必然是建立一个 MQTT 连接,而建立 MQTT 连接需要用到两个控制报文,它们分别是 CONNECT 报文与 CONNACK 报文。CONNECT 报文是客户端与服务端建立网络连接后,向服务端发送的第一个控制报文,用来发起连接请求。服务端将返回 CONNACK 报文告知客户端连接结果。
EMQ
1883 101
MQTT 5.0 报文解析 01:CONNECT 与 CONNACK
|
Java Maven Android开发
eclipse搭建springboot项目
本文介绍了如何使用Spring Initializr官网生成Spring Boot项目并用Eclipse打开和运行该项目,包括配置项目信息、添加依赖、下载依赖以及启动项目的步骤。
907 1
|
存储 关系型数据库 MySQL
如何搭建MySQL
【8月更文挑战第16天】如何搭建MySQL
310 1
|
存储 JSON JavaScript
cJSON开源项目详细解剖1
cJSON开源项目详细解剖
487 0