ThreadLocal的原理作用使用弱引用原因应用举例千山万水楼外楼

ThreadLocal就是一个类,他有get、set方法,可以起到一个保存、获取某个值的作用。但是这个类的get、set方法有点特殊,各个线程调用时是互不干扰的,就好像线程在操作ThreadLocal对象时是在操作线程自己的私有属性一样。具体原因在于他的方法实现:

publicTget(){Threadt=Thread.currentThread();//先确定调用我的线程ThreadLocalMapmap=getMap(t);//根据调用我的线程,找到这个线程的ThreadLocalMap对象if(map!=null){ThreadLocalMap.Entrye=map.getEntry(this);//以ThreadLocal对象为key,找到对应元素if(e!=null){@SuppressWarnings("unchecked")Tresult=(T)e.value;//讲元素的value返回returnresult;}}returnsetInitialValue();//如果调用我的线程没有ThreadLocalMap对象,则返回初始值}publicvoidset(Tvalue){Threadt=Thread.currentThread();//先确定调用我的是哪个线程ThreadLocalMapmap=getMap(t);//获取调用我的线程的ThreadLocalMapif(map!=null)map.set(this,value);//如果那个线程有map,就将此ThreadLocal对象为key的value设置好elsecreateMap(t,value);//如果那个线程还没有map,先创建一个再设置}ThreadLocalMap是ThreadLocal的内部类,为了不造成混乱,可以把他看作一个普通的类。ThreadLocalMap其实类似与HashMap,也是通过key获取某个值(key就是ThreadLocal对象),也是数组存储键值对,拉链法解决冲突等。一个Thread类持有一个ThreadLocalMap实例。

通过上面的源码也可以看出:线程互不干扰的操作ThreadLocal的原因就是,它的set、get方法是要先获取当前线程,然后修改、操作这个线程对象的成员属性。也就是说,调用ThreadLocal对象的set、get方法实际上是在操作当前线程的成员属性,只不过这些属性是通过ThreadLocal对象为key找到的而已。为了值观明了,看下图:

简单概括过程:有ThreadLocal对象tl,线程t调用tl.get(),则去线程t的ThreadLocalMap属性对象里找到一个entry,若entry.key==tl返回true,则此entry是目标entry,此entry.value就是我们的目标。

ThreadLocal对象只是一个获取当前线程某个私有属性的渠道而已,提供了set、get的入口,同时作为key去获取和设置目标值。真正的有效目标是属于线程对象私自持有的,自然通过ThreadLocal对象获取的值也就不会受其他线程影响啦。

二.用法示例

publicclassThreadLocalTest{privatestaticThreadLocaltl=newThreadLocal();//private是为了安全,是一个普遍做法;static是因为这个变量有可能在static方法中使用publicstaticvoidmain(String[]args){Threadt=newThread(()->{tl.set(1);tl.get();.........});}}

理解了ThreadLocal的原理,使用起来很简单,注意ThreadLocal对象的定义位置,检查作用域,保证可以被要使用它的线程访问到。

三.关于Entry的弱类型引用

如果阅读ThreadLocalMap的Entry源码会发现,Entry的key是弱引用:

staticclassEntryextendsWeakReference>{/**ThevalueassociatedwiththisThreadLocal.*/Objectvalue;Entry(ThreadLocal<>k,Objectv){super(k);//由于Entry继承了WeakReference,所以这里以一个弱引用指向ThreadLcoal对象value=v;}}为什么要这么做呢?看下面的这种场景:

publicvoidfunc1(){ThreadLocaltl=newThreadLocal();//line1tl.set(100);//line2tl.get();//line3}line1新建了一个ThreadLocal对象,t1是强引用指向这个对象;line2调用set()后,新建一个Entry,通过源码可知entry对象里的k是弱引用指向这个对象。如图:

当func1方法执行完毕后,栈帧销毁,强引用tl也就没有了,但此时线程的ThreadLocalMap里某个entry的k引用还指向这个对象。若这个k引用是强引用,就会导致k指向的ThreadLocal对象及v指向的对象不能被gc回收,造成内存泄漏,但是弱引用就不会有这个问题(弱引用及强引用等这里不说了)。使用弱引用,就可以使ThreadLocal对象在方法执行完毕后顺利被回收,而且在entry的k引用为null后,再调用get,set或remove方法时,就会尝试删除key为null的entry,可以释放value对象所占用的内存。

概括说就是:在方法中新建一个ThreadLocal对象,就有一个强引用指向它,在调用set()后,线程的ThreadLocalMap对象里的Entry对象又有一个引用k指向它。如果后面这个引用k是强引用就会使方法执行完,栈帧中的强引用销毁了,对象还不能回收,造成严重的内存泄露。

注意:虽然弱引用,保证了k指向的ThreadLocal对象能被及时回收,但是v指向的value对象是需要ThreadLocalMap调用get、set时发现k为null时才会去回收整个entry、value,因此弱引用不能保证内存完全不泄露。我们要在不使用某个ThreadLocal对象后,手动调用remoev方法来删除它,尤其是在线程池中,不仅仅是内存泄露的问题,因为线程池中的线程是重复使用的,意味着这个线程的ThreadLocalMap对象也是重复使用的,如果我们不手动调用remove方法,那么该线程后面执行时可能获取到上次执行遗留下来的value值,造成bug。

四.用途举例

Spring的RequestContextHolder就是这么操作的,这样在使用切面时,也可以获取到请求信息了(切面编程时自身是只可以获取到方法名+方法参数信息的):

THE END
1.法则之门揭秘法律基本知识的奥秘在探索法律基本知识之前,我们首先需要了解其起源和发展。法律作为社会治理的一种重要手段,随着人类社会的进步和文化的演变而不断完善。从古代律法到现代法典,每个时代都有其独特的特色和内涵。 三、立法原理:构建合理的规则体系 立法原理是指制定法律时应当遵循的一系列准则。这包括正当性原则,即立法应符合公平正义原则https://www.qmso18vkw.cn/jun-lei-zi-xun/248885.html
2.编译原理:词法分析(词法单元,自动机,NFA,DFA)逐个读入构造源程序的字符,把它们组成词法单元流,并完成和用户接口的一些任务。(输入源程序,输出单词符号) 过滤空白和注释 将编译器生成的错误的消息与源程序的位置联系起来 2,词法单元 词法单元:有一个词法单元名称和一个可选的属性值组成。 模式:描述一个此法单元的词素可能具有的形式。 https://blog.csdn.net/qq_42192693/article/details/105513840
3.法律特征及其在社会中的作用法律的特征和作用分别是什么法律,作为社会治理的重要工具,具有独特的特征和广泛的作用,它不仅规范了社会成员的行为,维护了社会秩序,还保障了公民的合法权益,促进了社会的公平正义,本文将详细探讨法律的特征及其在社会中的作用,法律的特有特征1、规范性:法,天纯雾芯科技http://www.skypure.com.cn/post/5706.html
4.法则精髓法律知识的全方位解析了解了法律是什么之后,我们要进一步探讨其构成。这包括立法(Legislation)、司法(Judiciary)和执法人(Executive)三个主要分支,以及它们之间相互作用的层级结构。立法分支负责制定法律;司 法分支负责解释和执行法律;执法人负责执行并保障实施各项政策,确保整个体系的顺畅运转。 https://www.erdqcvtxm.cn/jun-lei-wen-xian/406326.html
5.法则解析揭秘法律知识的精髓七、新时代背景下的挑战与机遇 随着科技发展和国际经济交流加深,我国立 法体系也在不断完善,以适应新时代需求。在这一过程中,我们应当积极学习并适应新的立场、新政策,以便更好地融入全球化环境,同时保证自身合理利益不受损害。 标签:菌类资讯https://www.qbsinawlr.cn/jun-lei-zi-xun/423901.html
6.华夏伏羲传承实证当中的基础呼吸法这个呼吸方法是远古四大传承体系当中,最基础的也是最重要的呼吸方法。在道家称为胎息,也称为内功息。在瑜伽传承当中,它是必不可少的练习方法。而在藏传佛教一样十分关注这个呼吸法,藏传佛教里面称为宝瓶气,包括伊斯兰做礼拜的时候也用此呼吸方法。 基础呼吸法原理和作用 http://www.360doc.com/content/24/0429/09/77015756_1121771830.shtml
7.中西医创新康复理疗设备“红外光灸疗**机”充分发挥作用为临床服务【摘要】:艾灸疗法是一种古老的中医外治法,**应用于临床上多种疾病的防治,是传统中医学中的重要干预手段。对于灸法起作用的机制研究,目前学术界基本认为是温热效应、红外辐射、**及生成物作用导致。其中红外光谱由于其“隐蔽性”,并未得到足够的重视,本文通过整理近些年的文献资料,对艾条燃烧时产生的红外光谱研究情况https://www.yuluyl.com/article-item-145.html
8.什么是场效应管场效应管参数命名方法作用原理用感应信号输人法估测场效应管的放大能力具体方法 用万用表电阻的R×100档,红表笔接源极S,黑表笔接漏极D,给场效应管加上1.5V的电源电压,此时表针指示出的漏源极间的电阻值。然后用手捏住结型场效应管的栅极G,将人体的感应电压信号加到栅极上。这样,由于管的放大作用,漏源电压VDS和漏极电流Ib都要发生变化http://www.kiaic.com/article/detail/972.html
9.二轮滑板是什么二轮滑板的原理和作用二轮滑板车怎么玩→摘要:本文主要介绍了二轮滑板的结构原理和使用功能特性,以及对爱斯卡二轮滑具有够酷、瘦身、不受年龄限制、不受场地限制等特性的介绍。两轮滑板使滑板运动得到淋漓尽致的发挥,经常使用活力板可以达到提高您的身体柔软度,平衡感和健美保健美容的作用。特别是腰部和腿部的健美。是一个既可以锻炼身体,健美,又可以得到很大的https://www.maigoo.com/goomai/81062.html
10.PAC混凝沉淀法的具体作用原理详解品牌:昊诺PAC混凝沉淀法的具体作用原理详解 混凝沉淀法的基本原理是在废水中投入PAC混凝剂,在废水里形成胶团,与废水中的胶体物质发生电中和,形成絮粒沉降。混凝沉淀可以去除废水中的粒径细小的悬浮颗粒,而且还能去除色度、油分、微生物、氮和磷等富营养物质,重金属以及有机物等。 https://china.guidechem.com/trade/pdetail25074004.html
11.按摩推拿法原理及作用部位song376456按摩推拿法原理及作用部位 一、在振颤手法中力的运用 在按摩的过程中,术者要长时间地运用手法,势必消耗很大竺警量,所以,术考一定要合理运用手法,掌握用力原理,熟练手法,才能更好地发挥按摩的作用。 振颤手法的特点是往返性和重复性。可以用频率、周期来描述其特点。振颤周期是振颤一次全振动的时间,一般用t表示,http://blog.chinaunix.net/uid-24211955-id-3048504.html
12.平衡梁有哪些作用原理?摊铺机平衡梁法和走线法是什么?平衡梁在摊铺机平衡梁法和走线法是什么?平衡梁在起重工程的作用 平衡梁为吊装机具的重要组成部分,在起重工程中被广泛应用。平衡梁又称铁扁担。可用于保持被吊设备的平衡,避免吊索损坏设备;缩短吊索的高度,减小动滑轮的起吊高度 ;减少设备起吊时所承受的水平压力,避免损坏设备;多机抬吊时,采用平衡梁还可以合理分配或平衡各http://21560.sinomep.com/xsb/2022/0622/062229871.html
13.中国特色马克思主义法学理论研究学术著作第三节 中国社会主义法的产生与发展的特点 / 089 一、中国社会主义法的产生和发展立足于中国实际 / 089 二、中国社会主义法的产生和发展伴随着法理论上的发展和变迁 / 092 三、中国社会主义法的完善之路 / 094 第二章 中国社会主义法的作用与价值 / 097 第一节 中国社会主义法的作用 / 098 一、马克思主义经典http://www.cuplpress.com/index.php?m=book&a=detail&id=10195
14.科学网—马哲原理【原理内容】辩证唯物主义认为:物质第一性,意识第二性,物质决定意识,意识是物质的反映。 【方法论要求】这一原理要求我们在想问题、办事情要坚持一切从实际出发,实事求是,使主观符合客观。反对主观主义。 2.意识的反作用原理 【原理内容】物质决定意识,意识对物质具有反作用。正确反映客观事物及其发展规律的意识,对事https://blog.sciencenet.cn/blog-40486-326104.html
15.2024考研政治马克思主义十六大原理考点梳理二、辩证法原理 原理1 事物普遍联系原理 【原理内容】 1.唯物辩证法认为,事物是普遍联系的,世界上的一切事物都处在普遍的联系之中,没有任何一个事物孤立地存在,整个世界就是一个普遍联系的统一整体,事物的普遍联系是通过中介实现的。 2.事物的相互联系即相互作用构成事物的运动变化发展。 https://kaoyan.xdf.cn/202302/12898668.html
16.法线贴图的原理和作用3D建模模拟仿真法线贴图的原理和作用 在上一篇文章中详细介绍了位移贴图的相关知识,在本章中我们继续讲述法线贴图的相关概念,文章后面继续用GLTF 编辑器来演示下法线贴图的模型渲染效果。 1、什么是法线贴图 法线贴图(Normal Map)是一种纹理映射技术,用于在渲染过程中模拟物体表面的细节和几何形状。它通过使用RGB颜色https://segmentfault.com/a/1190000044248477
17.吐气法的基础知识这些方法共同的特点,就是由呼吸入手,另一个共同特点,就是止于吸吸,并没讲这些方法更深入的原理,很可能原理的部分是密传的,不管怎么说,把这个方法的原理、作用都讲得这么透彻的,就是我们今天要吐气法了。 吐气法的原理是利用吐气的运动来带动能体,通过一次次的吐气运动,来体认随吐气过程而带起来的身体内升起的https://www.shixiushijie.com/?p=3001