最新要闻
- 前沿热点:国产战机大片!电影《长空之王》定档:今年五一上映
- 杭州外来人口占3成 河南人数比肩本地土著 原来有历史原因
- 小米13系列大卖、汽车售价可达35万以上 小米高端成了:股价大涨
- 采埃孚新安全带:不用开空调 可提升电动车15%续航
- 焦点速读:3999元起 一加11首销51分钟打破所有二代骁龙8销量、销售额双记录
- 家用光纤宽带多少兆合适?家用光纤怎么接路由器?
- 招财猫的原型是什么猫?招财猫左手右手分别代表什么?
- 修正液的成分是什么?修正液的性质有哪些?
- 丁克家族是什么意思?丁克家庭的好处和坏处有哪些?
- 纪宝贝是什么电视剧的角色?纪宝贝是什么品种的狗?
- 天天快报!华硕ROG首款DP2.1接口显示器发布:无压缩4K 160Hz画质
- 世界热讯:车主激烈维权上演0元购!特斯拉成都门店否认:都是理性维权
- 重达2.4吨!美国40年前发射卫星今日坠落地球:或为朝鲜半岛
- 行业最低!一加Buds Pro 2首销899元:全链路延时仅54ms
- 【全球独家】腾讯发布未成年人春节寒假限玩通知:春节7天全开 工作日继续禁玩
- 全球滚动:特斯拉降价 国外车主怎么就不闹:原因发人深思
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
今日最新!ThreadLocal源码解析及实战应用
作者:京东物流 闫鹏勃
1 什么是ThreadLocal?
ThreadLocal是一个关于创建线程局部变量的类。通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。ThreadLocal在设计之初就是为解决并发问题而提供一种方案,每个线程维护一份自己的数据,达到线程隔离的效果。
(资料图)
2 有什么作用?
2.1 set once,get everywhere
在现在的系统设计中,前后端分离已基本成为常态,分离之后如何获取用户信息就成了一件麻烦事,通常在用户登录后, 用户信息会保存在Session或者Token中。这个时候,我们如果使用常规的手段去获取用户信息会很费劲,拿Session来说,我们要在接口参数中加上HttpServletRequest对象,然后调用 getSession方法,且每一个需要用户信息的接口都要加上这个参数,才能获取Session,这样实现就很麻烦了。
在实际的系统设计中,我们肯定不会采用上面所说的这种方式,而是使用ThreadLocal,我们会选择在拦截器的业务中, 获取到保存的用户信息,然后存入ThreadLocal,那么当前线程在任何地方如果需要拿到用户信息都可以使用ThreadLocal的get()方法 (异步程序中ThreadLocal是不可靠的)
2.2 线程安全,空间换时间
在Spring的Web项目中,我们通常会将业务分为Controller层,Service层,Dao层, 我们都知道@Autowired注解默认使用单例模式,那么不同请求线程进来之后,由于Dao层使用单例,那么负责数据库连接的Connection也只有一个, 如果每个请求线程都去连接数据库,那么就会造成线程不安全的问题,Spring是如何解决这个问题的呢?
在Spring项目中Dao层中装配的Connection肯定是线程安全的,其解决方案就是采用ThreadLocal方法,当每个请求线程使用Connection的时候, 都会从ThreadLocal获取一次,如果为null,说明没有进行过数据库连接,连接后存入ThreadLocal中,如此一来,每一个请求线程都保存有一份 自己的Connection。于是便解决了线程安全问题
3 ThreadLocal实战应用
3.1 ehr中的使用
在登录拦截器中将用户信息写入,后续使用时方便取值
3.2 分页插件PageHelper中的应用
3.3 AopContext
4 源码解读
你是否有这样的疑惑?为什么可以直接拿到?对象存放在哪里?存在什么问题?
4.1 get方法
在 get() 方法中也会获取到当前线程的 ThreadLocalMap,如果 ThreadLocalMap 不为 null,则把获取 key 为当前 ThreadLocal 的值;否则调用 setInitialValue() 方法返回初始值,并保存到新创建的 ThreadLocalMap 中。
4.2 set方法
调用set时,直接调用set(T value) 方法中,首先获取当前线程,然后在获取到当前线程的 ThreadLocalMap,如果 ThreadLocalMap 不为 null,则将 value 保存到 ThreadLocalMap 中,并用当前 ThreadLocal 作为 key;否则创建一个 ThreadLocalMap 并给到当前线程,然后保存 value。
ThreadLocalMap 相当于一个 HashMap,是真正保存值的地方map的set,如果map为空,则创建一个
4.3 initialValue() 方法
initialValue() 是 ThreadLocal 的初始值,默认返回 null,子类可以重写改方法,用于设置 ThreadLocal 的初始值。
4.4 remove() 方法
ThreadLocal 还有一个 remove() 方法,用来移除当前 ThreadLocal 对应的值。同样也是同过当前线程的 ThreadLocalMap 来移除相应的值。
getMap拿到了什么?在 set,get,initialValue 和 remove 方法中都会获取到当前线程,然后通过当前线程获取到 ThreadLocalMap,如果 ThreadLocalMap 为 null,则会创建一个 ThreadLocalMap,并给到当前线程
此处t是Thread,直接可以“点”拿到这个map每个Thread对象内部都维护了一个ThreadLocalMap这样一个ThreadLocal的Map,可以存放若干个ThreadLocal
在使用 ThreadLocal 类型变量进行相关操作时,都会通过当前线程获取到 ThreadLocalMap 来完成操作。每个线程的 ThreadLocalMap 是属于线程自己的,ThreadLocalMap 中维护的值也是属于线程自己的。这就保证了 ThreadLocal 类型的变量在每个线程中是独立的,在多线程环境下不会相互影响。
5 使用注意事项
1)有可能导致内存泄漏,使用完毕后,需要remove
在 ThreadLocalMap 的 set(),get() 和 remove() 方法中,都有清除无效 Entry 的操作,这样做是为了降低内存泄漏发生的可能。Entry 中的 key 使用了弱引用的方式,这样做是为了降低内存泄漏发生的概率,但不能完全避免内存泄漏。
假设 Entry 的 key 没有使用弱引用的方式,而是使用了强引用:由于 ThreadLocalMap 的生命周期和当前线程一样长,那么当引用 ThreadLocal 的对象被回收后,由于 ThreadLocalMap 还持有 ThreadLocal 和对应 value 的强引用,ThreadLocal 和对应的 value 是不会被回收的,这就导致了内存泄漏。所以 Entry 以弱引用的方式避免了 ThreadLocal 没有被回收而导致的内存泄漏,但是此时 value 仍然是无法回收的,依然会导致内存泄漏。
ThreadLocalMap 已经考虑到这种情况,并且有一些防护措施:在调用 ThreadLocal 的 get(),set() 和 remove() 的时候都会清除当前线程 ThreadLocalMap 中所有 key 为 null 的 value。这样可以降低内存泄漏发生的概率。所以我们在使用 ThreadLocal 的时候,每次用完 ThreadLocal 都调用 remove() 方法,清除数据,防止内存泄漏。
2)使用线程池时,父子线程传递慎用,因为初始化时机为线程创建时
3)针对2有什么方案可以解决?TransmittableThreadLocal源码地址:https://github.com/alibaba/transmittable-thread-local详解:https://www.jianshu.com/p/e0774f965aa3
今日最新!ThreadLocal源码解析及实战应用
交换机二层组播配置
管理工具造成的阻塞
前沿热点:国产战机大片!电影《长空之王》定档:今年五一上映
杭州外来人口占3成 河南人数比肩本地土著 原来有历史原因
小米13系列大卖、汽车售价可达35万以上 小米高端成了:股价大涨
采埃孚新安全带:不用开空调 可提升电动车15%续航
焦点速读:3999元起 一加11首销51分钟打破所有二代骁龙8销量、销售额双记录
家用光纤宽带多少兆合适?家用光纤怎么接路由器?
招财猫的原型是什么猫?招财猫左手右手分别代表什么?
修正液的成分是什么?修正液的性质有哪些?
丁克家族是什么意思?丁克家庭的好处和坏处有哪些?
纪宝贝是什么电视剧的角色?纪宝贝是什么品种的狗?
印度首家旗舰店来了?传苹果(AAPL.US)开始招聘零售店员工
年终盘点丨最受开发者欢迎的文章 TOP20
天天快报!华硕ROG首款DP2.1接口显示器发布:无压缩4K 160Hz画质
世界热讯:车主激烈维权上演0元购!特斯拉成都门店否认:都是理性维权
重达2.4吨!美国40年前发射卫星今日坠落地球:或为朝鲜半岛
行业最低!一加Buds Pro 2首销899元:全链路延时仅54ms
【全球独家】腾讯发布未成年人春节寒假限玩通知:春节7天全开 工作日继续禁玩
京音平台-一起玩转SCRM之电销系统
全球滚动:特斯拉降价 国外车主怎么就不闹:原因发人深思
环球观速讯丨电视“套娃式充会员”吃相难看 有人呼吁建立互相兼容的会员体系
天天要闻:电子后视镜正式获批!吉利路特斯首批上车:选装费1万6
北斗三号卫星系统总设计师:北斗核心指标已超GPS
精选!极端暖冬席卷欧洲 多国冬天“入夏”:天然气价格也遭暴跌
环球热门:深拷贝、浅拷贝
6.Servlet
环球短讯!春节档电影票房乐观预测可达85亿 吴京主演《流浪地球2》领跑
每日焦点!支付宝2023年“集五福”来了 网友:两块钱的大项目
时讯:网站关停!广汽讴歌成为历史 正式退出中国市场
2023中国航天开门红!我国再次成功发射一箭三星
卢伟冰:Redmi K60卖的非常好 是2.5K-4K价位首选!
天天即时看!未来要取代iPhone!苹果AR/VR头戴设备将春季发布:原型机已发放
A16研发失败后!iOS 17首曝光:苹果挤牙膏 没重大更新让人失望
天天讯息:电源买双倍功率就中计啦!大可不必
全球观热点:用4年依旧流畅!一加11今日首销:最低12G内存 3999元起
焦点速讯:暴雪网易复合几乎不可能:不会降低标准 正和新代理谈的火热
4week-3字符串和字符
世界时讯:DVWA靶场实战(五)——File Upload
ACWING 4366. 上课睡觉
【世界速看料】NVIDIA正在开发AI优化驱动:性能飙升30%
大几千元的空气消毒机是智商税吗?这操作多少有点愣
世界信息:神奇的雌雄同体:一不小心 “老婆”变成“老公”
[1] LeetCode 刷题笔记: 两数之和 [S]
expres实现登录与修改密码
《鹿鼎记》主演时隔24年重聚:小宝的四个老婆 她几乎没变
Codeforces 1671 F Permutation Counting 题解
关注:如何优雅地校验后端接口数据,不做前端背锅侠
《中国奇谭》封神:上线仅三集 追番量破200万
红旗正式发布新能源品牌:全新LOGO 新车3秒破百
【环球新视野】学习笔记——Maven的核心概念之仓库、坐标;maven的依赖管理;Maven中统一管理版本号;Maven的继承;Maven的聚合
jmap——Java内存分析工具
全球消息!AMD锐龙7040砍掉没用的PCIe 5.0!内存翻番256GB
全球快看点丨微软Xbox老大斯宾塞盛赞索尼:无障碍手柄是对PS生态很好的补充
环球观热点:1.Maven入门
每日快播:特斯拉的好日子 到头了
全球热资讯!马斯克承诺成空谈!推特被裁员工仅获1个月工资补偿
中国空间站能量粒子探测器成功安装:自主研发 将开启10年运行
世界快报:Steam特别好评!PC策略大作《文明6》打0.9折:入正绝佳时机
20万天价酒店被抢光!春节旅游十大热门目的地公布
当前讯息:美国能源部出手 阿贡开发出全新锂硫电池:能量密度可达特斯拉4680十倍
看热讯:网约车带走3岁孩子妈妈一路狂追 司机委屈:不敢从反光镜看女乘客
精选!C++ TinyWebserver 部署到Linux下,并运行(使用的是Vmware的虚拟机运行Ubuntu20.04)
世界新动态:JavaWeb概述
世界热讯:姚明12岁女儿最新身高曝光 网友:基因太强大!专家科普
乘客羽绒服炸开 绒毛飘满地铁车厢:这是为什么呢?
PC游戏掌机OneXPlayer 2发布:首发6099元起 流畅玩3A大作
Codeforces 1305 F Kuroni and the Punishment 题解 (随机算法)
Python深浅拷贝的理解
今日播报!基于卷积神经网络的人脸表情识别应用--AR川剧变脸(一)
Python中 re.compile 函数的使用
环球快看:学习笔记——在IDEA中创建Maven工程之HelloWord;Maven中常见的问题;Maven核心概念之POM、生命周期、插件和目标
天天动态:科学家都惊到的减肥药出现了!每周一针 有人减掉近一半体重
安全专家发现汽车漏洞 几乎全球所有汽车品牌均中招
仅175克重!夏普发布2K 120Hz头戴显示器
世界球精选!迪士尼玲娜贝儿头部被男子拍打 专家科普:内有钢架 可能造成脑震荡
最新消息:MySQL——锁
【全球新要闻】突破3200万!Steam同时在线再创新高
尹烨:俞敏洪是中国男人应该有的样子 你怎么看?
【天天速看料】女子吐槽小区新能源车主将充电枪提前锁车内 电价便宜再充
迈出国门!国产科幻《流浪地球2》确定将在新西兰等地上映
今日热门!特斯拉降价车主组团维权:维权没结果 又被收了7块停车费
每日视点!简单的24点小游戏
最资讯丨Java Netty框架自建DNS代理服务器教程
天天动态:著名配音艺术家苏秀去世 享年97岁:曾为上影动画《天书奇谭》配音
天天播报:苹果MFi认证 iPhone快充线23.9元:自动匹配iOS版本 不弹窗
手慢真的无了!杰士邦镇店之宝大促:原价169.9元券后19.9
天天快看点丨学习笔记——Maven的基本配置、Maven基本使用、将Maven整合到IDEA中
LeetCode 887. 鸡蛋掉落-题解分析
【当前热闻】男子新买百万奔驰被朋友借走撞烂:保险拒赔!最终结局意外
江西南昌县发生重大交通事故 造成17人死亡22人受伤
【环球新视野】特斯拉车价降至史上最低!才开30公里车主委屈:销售催提车
热讯:java多线程知识点总结
今日热门![Docker] 将容器打包成镜像、镜像分层机制详解
每日视点!成都车主“0元购”引热议 此前还有维权车主要平分特斯拉股权
环球速看:学习笔记——Maven
最资讯丨国产特斯拉大降价后车主维权 能拿到四项补偿?回应来了
电动救生圈亮相CES:时速15公里 续航6公里
《三体》动画播放量破3亿!豆瓣跌破5分 差评率高达83%