threadlocal存连接对象的目的_终于懂了ThreadLocal,不再害怕面试官问了

ThreadLocal解析

synchronized和ThreadLocal的区别:

synchronized:以时间换空间,只提供一份变量,让不同的线程排队访问,失去了并发性,降低了程序效率,着重对各线程之间访问资源的同步性

ThreadLocal:以空间换时间,每个线程都提供一份变量副本,每个线程的数据是隔离的,提高了并发性

ThreadLocal使用场景:数据库连接、Session管理

ThreadLocal的数据结构:

Mapnew ThreadLocal(),T>> map=new HashMap<>();

方便理解,源码中并没有这个map

set()方法:

cbbc97355f69f7361c622e877c4d85f7.png

getMap():

3768f2468d1c3ad7220349ce11b3564e.png

createMap():

8ba4b26560492378e465e29454c37ac9.png

Ok现在我们走一遍程序流程:1.现在有一个ThreadLocal实例对象->ThreadLocalconn_tl = new ThreadLocal()

调用conn_tl.set()方法,获取当前执行的线程,根据当前线程获取一个ThreadLocalMap实例对象threadLocals,threadLocals里面存 conn_tl和value

ThreadLocalMap是一个定义在ThreadLocal中的静态内部类:

c26298323fa85e826b74317b0684a76f.png

static class ThreadLocalMap {

static class Entry extends WeakReference> {

Object value;

Entry(ThreadLocal> k, Object v) {

super(k);//由于Entry继承了WeakReference,所以这里以一个弱引用指向ThreadLcoal对象

value = v;

}

}

为什么ThreadLocalMap会是ThreadLocal的静态内部类:ThreadLocalMap是由ThreadLocal创建管理的,只被ThreadLocal所使用

静态内部类的作用:1)首先,用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。所以没有必要专门用一个Java文件存 放这个类。

2)静态都是用来修饰类的内部成员的。比如静态方法,静态成员变量,静态常量。它唯一的作用就是随着类的加载(而不是随着对象的产生)而产生,以致可以用类名+静态成员名直接获得。

这样静态内部类就可以理解了,因为这个类没有必要单独存放一个文件,它一般来说只被所在外部类使用。并且它可以直接被用外部类名+内部类名获得。

为什么Entry中的key是弱引用:

这里的key是ThreadLocalconn_tl = new ThreadLocal()中的conn_tl。在外部他是一个强引用,在Entry中key是弱引用。也就是有两个引用指向ThreadLocal实例对象

ba6b21f3e4737470dc970965e6e0dfa7.png

当外部方法执行完毕,栈帧销毁强引用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 是强引用就会使方法执行完,栈帧中的强引用销毁了,对象还不能回收,造成严重的内存泄露。

弱引用的好处:当一个对象仅仅被weak reference指向, 而没有任何其他strong reference指向的时候, 如果GC运行, 那么这个对象就会被回收。如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win10电脑回收站中被清空的文件怎么恢复

Win10电脑回收站中被清空的文件怎么恢复?用户为了保证电脑流畅的运行速度和空间&#xff0c;会在回收站中存在一些垃圾的时候&#xff0c;选择清理掉。但是有时候误删了一些文件&#xff0c;并且回收站的的文件也被我们清理掉了还可以找回吗?该如何找回呢? Win10电脑回收站…

主板后置音频接口图解_颜值出众、用料靠谱——华擎(ASRock)Z490 Extreme4极限玩家主板 简析...

一、前言你们能想象嘛&#xff0c;那种主板已经到了&#xff0c;处理器却没抢到的感觉。刚开始看到Plus会员提前抢的时候&#xff0c;我心里面还有一些放心&#xff0c;但当时间刚过秒变无货的时候&#xff0c;一切又已回到当初&#xff0c;难受&#xff01;居然没有首发抢到10…

Win10笔记本设置合盖不息屏的方法

正常使用Win10笔记本合上盖子就会自动熄屏&#xff0c;不过有一些小伙伴并不想笔记本合盖息屏&#xff0c;那么如果想要笔记本合盖能够不息屏的话&#xff0c;Win10笔记本怎么设置合盖不息屏呢?下面小编就来教一教大家Win10笔记本设置合盖不息屏的方法吧。 Win10笔记本设置合…

中查出所有姓张的学生为啥查不出来_只有笔试成绩没有面试成绩是什么原因 教师资格面试成绩怎么查...

[闽南网]对于很多同学来说&#xff0c;今晚是个不眠夜。就在几个小时前&#xff0c;教师资格证面试成绩查询入口开通了&#xff0c;相比之前发布的消息&#xff0c;成绩公布提前了很多。参加了这次教师资格证考试的同学&#xff0c;一得到消息就忙着查成绩&#xff0c;毕竟面试…

Win10网络共享设置的方法步骤

有时候我们在工作的时候&#xff0c;想要共享文件或者共享别的东西&#xff0c;都需要先设置局域网&#xff0c;那么Win10系统局域网共享怎么设置呢?其实方法也简单&#xff0c;下面我们就来看看Win10网络共享设置的方法步骤&#xff0c;大家一起来看看吧。 Win10网络共享设置…

c++用模板实现稀疏多项式_用线性表实现一元多项式及相加运算

“ 本文主要讨论线性表在多项式计算中的应用&#xff0c;讨论内容涉及到一元n次多项式在计算机中的表示&#xff0c;及多项式相加运算。”01在数学上&#xff0c;一个一元n次多项式可以按照升幂写成Pn(x) p0 p1x p2x2 …… pnxn它由n1个系数唯一确定。因此&#xff0c;一个…

Win11如何重置电脑 Win11重置电脑教程

我们升级Win11之后&#xff0c;因为对系统的不熟悉可能会进行很多错误的设置&#xff0c;结果造成系统出现了很多问题&#xff0c;这时候我们不想要重装&#xff0c;想要将设置全部恢复到最初的样子需要怎么操作&#xff0c;如果你还不会可以看下面Win11系统恢复重置的教程。 …

cdh mysql sqoop 驱动_大数据技术之Sqoop学习——原理、安装、使用案例、常用命令...

第1章 Sqoop 简介Sqoop 是一款开源的工具&#xff0c;主要用于在 Hadoop(Hive) 与传统的数据库 (mysql,postgresql,...) 间进行数据的高校传递&#xff0c;可以将一个关系型数据库(例如&#xff1a;MySQL,Oracle,Postgres等)中的数据导入到 Hadoop 的 HDFS 中&#xff0c;也可以…

Win11怎么设置耳机和音响一起响

许多用户在使用电脑的时候&#xff0c;都会进行一系列的设置。而不少用户在使用的时候还有一些特殊的需求&#xff0c;例如有些小伙伴在使用Win11的时候想要设置耳机和音响同时响&#xff0c;那么具体的话要怎么设置呢?下面小编就带着大家一起看看吧! 操作方法&#xff1a; …

Win7旗舰版电脑开机慢的解决方法

随着人们生活水平的不断提高&#xff0c;很多朋友都拥有了电脑&#xff0c;Win7旗舰版系统电脑开机慢应该怎么办呢?还不知道的朋友快来跟着系统之家小编一起学习一下Win7旗舰版电脑开机慢的解决方法吧。 Win7旗舰版电脑开机慢的解决方法 1、进入系统桌面&#xff0c;鼠标右键…

Javamysql语法转化oracle_MySQL与Oracle的语法区别详细对比

Oracle和mysql的一些简单命令对比1) SQL> select to_char(sysdate,yyyy-mm-dd) from dual;SQL> select to_char(sysdate,hh24-mi-ss) from dual;mysql> select date_format(now(),%Y-%m-%d);mysql> select time_format(now(),%H-%i-%S);日期函数增加一个月&#x…

UC浏览器电脑版怎么设置字体大小 UC浏览器字体设置教程

对于一些视力不好的小伙伴进行浏览网页的时候&#xff0c;要是浏览器的字体更大些的话看着就会轻松多了&#xff0c;下面小编就为你带来UC浏览器字体设置教程。 UC浏览器电脑版怎么设置字体大小&#xff1a; 打开UC浏览器&#xff0c;点击“菜单”按钮&#xff0c;然后从弹出…

邮票的孔怎么做出来的_金银花茶是怎么做出来的呢

花期爱亦长&#xff0c;变换自然妆。蝶恋金银露&#xff0c;风柔满院香。说起金银花&#xff0c;可能大家都不陌生&#xff0c;它无论是作为观赏性盆景还是作为金银花养生茶都是非常适宜的。金银花被称为夏天第一花&#xff0c;夏天喝不仅能清热解暑&#xff0c;还能去除许多小…

python画资本市场线_金融学笔记:CAPM,从资本配置线 CAL、资本市场线 CML,到证券市场线 SML...

在这里&#xff0c;我们已有了均值&#xff0d;方差前沿&#xff1a;其中是风险资产的协方差矩阵&#xff0c; 但其实在本文中&#xff0c;均值&#xff0d;方差前沿的具体数学形式并不重要&#xff0c;以上内容可以忽略。我们现在可画出均值&#xff0d;方差前沿的图像&#x…

Win10 C盘空间越来越小怎么办

Win10系统c盘空间自动变小了怎么办?相信很多朋友会发现C盘的空间莫名其妙的越来越少&#xff0c;不知道是哪些文件占用了C盘的空间&#xff0c;下面小编就为大家带来Win10系统C盘变小的解决方法。 对于很多PC用户来说&#xff0c;如今都用上了SSD与最新的Win10操作系统&#…

Win10乱码了怎么解决 Win10系统乱码解决办法

用电脑时&#xff0c;如果突然发现电脑出现乱码的现象&#xff0c;那一瞬间会觉得很头皮发麻&#xff0c;刚好最近就有小伙伴来问win10改了系统语言还是乱码的问题&#xff0c;今天小编来跟大家说说win10乱码了怎么办的解决方法&#xff0c;大家一起来看看吧。 1、进入控制面板…

filter java oauth_java – 带有自定义安全过滤器的Spring Boot OAuth2

我有一个带有OAuth2授权和资源服务器的spring boot设置.用户可以通过向/ oauth / token发出POST请求来获取令牌.到现在为止还挺好.但是,我不想通过BASIC auth保护/ oauth / token,而是通过自定义安全过滤器.我尝试了以下内容,但从未调用过DemoAuthenticationFilter&#xff1a;…

2345王牌浏览器网页加载慢怎么办 网页加载慢解决

2345王牌浏览器网页加载慢怎么办?相信很多2345王牌浏览器用户都碰到过这个问题&#xff0c;今天小编就给大家带来这个解决办法&#xff0c;让你拥有极速加载网页。 2345王牌浏览器网页加载慢解决办法 1、打开清除上网痕迹。 入口一&#xff1a;标签栏居中&#xff0c;菜单栏…

eclipse不进入断点_Eclipse 调试中不支持运行到断点问题

引用eclipse debug URLClassPath.getLoader(int) file结果在这个地方[url]http://www.eclipse.org/forums/index.php?tmsg&S73b3719b575dd532260d1809694f886b&th77485&goto241565[/url]找到了一些简介.就是因为,其它的项目有的断点.把那些断点去掉就可以了.This…

华硕主板专用Ghost Win11 64位专业体验版 V2021.08

华硕主板专用Ghost Win11 64位专业体验版是微软最新发布的电脑操作系统&#xff0c;目前Win11系统已经更新至第六个预览版本&#xff0c;增加和修复了众多的内容&#xff0c;这里小编为大家带来最新版下载&#xff0c;用户可以一键快速安装! 华硕主板专用Ghost Win11 64位专业…