深入剖析ThreadLocal实现原理以及内存泄漏问题

关于ThreadLocalMap<ThreadLocalObject>弱引用问题:

当线程没有结束,但是ThreadLocal已经被回收,则可能导致线程中存在ThreadLocalMap<nullObject>的键值对,造成内存泄露。(ThreadLocal被回收,ThreadLocal关联的线程共享变量还存在)。

虽然ThreadLocal的get,set方法可以清除ThreadLocalMap中key为null的value,但是get,set方法在内存泄露后并不会必然调用,所以为了防止此类情况的出现,我们有两种手段。

1、使用完线程共享变量后,显示调用ThreadLocalMap.remove方法清除线程共享变量;

2、JDK建议ThreadLocal定义为private static,这样ThreadLocal的弱引用问题则不存在了。

 

最常见的ThreadLocal使用场景为 用来解决 数据库连接、Session管理等。

private static ThreadLocal<Connection> connectionHolder= new ThreadLocal<Connection>() {public Connection initialValue() {return DriverManager.getConnection(DB_URL);}};public static Connection getConnection() {return connectionHolder.get();
}
private static final ThreadLocal threadSession = new ThreadLocal();public static Session getSession() throws InfrastructureException {Session s = (Session) threadSession.get();try {if (s == null) {s = getSessionFactory().openSession();threadSession.set(s);}} catch (HibernateException ex) {throw new InfrastructureException(ex);}return s;
}

 

 

http://blog.csdn.net/lhqj1992/article/details/52451136

http://www.cnblogs.com/onlywujun/p/3524675.html

 

https://www.cnblogs.com/coshaho/p/5127135.html

http://www.cnblogs.com/dolphin0520/p/3920407.html

 

转载于:https://www.cnblogs.com/genggeng/p/7477191.html

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

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

相关文章

解读《普通大学应届毕业生如何成功应聘微软》

《普通大学应届毕业生如何成功应聘微软》这篇文章很有实践性&#xff0c;我所要提的&#xff0c;是最后一道面试&#xff0c;也就是唐骏本人对作者的面试&#xff0c;这一轮看似平常的面试大有门道。仔细想想&#xff0c;为什么这些问题由唐骏本人来问&#xff0c;他为什么要这…

grep 命令的 12 个实例

2019独角兽企业重金招聘Python工程师标准>>> 你是否遇到过需要在文件中查找一个特定的字符串或者样式&#xff0c;但是不知道从哪儿开始&#xff1f;那么,就请grep来帮你吧。 grep是每个Linux发行版都预装的一个强有力的文件模式搜索工具。无论何种原因&#xff0c;…

php 怎么从memcache缓存数据中统计某一字段总数,php和memcache统计在线人数的方法...

$mc new Memcache ();// 连接memcache$mc->connect("127.0.0.1", 11211);// 获取 在线用户 IP 和 在线时间数据$online_members $mc->get(online_members);// 如果为空&#xff0c;初始化数据if (!$online_members) {$online_members array();}// 获取用户i…

ubuntu之ufw防火墙

UFW是Ubuntu下的一个主机端的iptables类防火墙配置工具(底层调用iptables来处理)。这个工具的目的是提供给用户一个可以轻松驾驭的界面&#xff0c;就像包集成和动态检测开放的端口一样。虽然功能较简单&#xff0c;但对桌面型应用来说比较实用&#xff0c;基本常用功能都有&am…

background-size在IE8不兼容问题

background-size在IE8及以下浏览器不兼容&#xff1b;要解决的话要用滤镜&#xff1a; filter: progid: DXImageTransform.Microsoft.AlphaImageLoader( src, sizingMethodscale); 注意&#xff1a;此处src的路径必须是绝对路径&#xff0c;相对路径不可以&#xff01; 当写完…

程序员 大牛 面试

水 滴 石 穿 -- 找工作记 -- yurking&#xff08;yurkinggmail.com&#xff09; 一日一钱&#xff0c;千日千钱&#xff0c;绳锯木断&#xff0c;水滴石穿! 这个东西写出来有一段时间了&#xff0c;但是一直没发&#xff0c;想着等有时间了再好好的看一看&#xff0c;改一…

Linux : shell基础(慕课网Linux达人养成计划课程笔记)

Shell概述 shell是Linux中的命令行解释器&#xff0c;为用户提供了一个向Linux内核发送请求一边运行程序的界面系统级程序&#xff0c;用户可以用shell来启动、挂起、停止甚至编写一些程序。shell还是一个功能相当强大的编程语言&#xff0c;易编写&#xff0c;易调试&#xff…

基于matlab的大米,大米颗数计算MATLAB软件

应用背景大米是人类的主食之一&#xff0c;是稻谷经清理、砻谷、碾米、成品整理等工序后制成的成品。人们购买米大多采用直接称量的方法&#xff0c;市面上也有许多仪器采用光电传感器等方式用于生产加工时米粒的计数。然而这样的方法都比较依赖于设备&#xff0c;不方便人们日…

ubuntu17.04之apt-get源

不要问我这么简单的也要写&#xff0c;我只想说在网上百度了一堆源&#xff0c;在笔者这里只有一个能用&#xff0c;悲伤的表情&#xff0c;还是记录一下吧 这个是清华的apt-get源&#xff0c;适用于ubuntu17.04apt-get源文件目录 /etc/apt/sources.list &#xff0c;记得先备份…

HttpClient通过Post方式发送Json数据

服务器用的是Springmvc&#xff0c;接口内容&#xff1a; [java] view plaincopy print?ResponseBody RequestMapping(value"/order",methodRequestMethod.POST) public boolean order(HttpServletRequest request,RequestBody List<Order> orders) throws …

openssl、ssh

PKI&#xff1a;公钥基础设施&#xff0c;保证服务器向客户端发送的证书的可靠性&#xff1b;签证机构&#xff1a;CA注册机构&#xff1a;RA证书吊销列表&#xff1a;CRL证书存取库&#xff1a;CAB威瑞信——verisignGlobalSign赛门铁克AsiaCOM国际标准化组织定义了证书的标准…

php图型分析插件,IMAGE缩略图插件

应用信息 名称: IMAGE缩略图插件 售价: (免费) 应用ID: IMAGE 最低要求: Z-BlogPHP 1.5.1 Zero Build 151740版 本: 2 发布日期: 2014-08-27PHP最低版本要求: 5.3 更新日期: 2018-05-21立即购买 加入购物车作者信息 开发者ID: 十五楼的鸟儿 本站用户组: 管理员 联系邮箱: adm…

职业生涯步步高

在担任公司高管的几年间&#xff0c;我面试过数以百计的各个层面的员工&#xff0c;其中最让我感到遗憾的一个现象就是很多人有着非常好的素质&#xff0c;甚至有的还是名校的毕业生&#xff0c;因为不懂得去规划自己的职业&#xff0c;在工作多年后&#xff0c;依然拿着微薄的…

httpd2.2配置文件详解

一丶Apache常用目录详解1) /etc/httpd/conf/httpd.confhttpd.conf是Apache的主配文件&#xff0c;整个Apache也不过就是这个配置文件&#xff0c;里面几乎包含了所有的配置。有的distribution都将这个文件拆分成数个小文件分别管理不同的参数。但是主要配置文件还是以这个文件为…

2017.9.5 postgresql加密函数的使用

需要安装的插件的名字&#xff1a;pgcrypto官网地址&#xff1a;https://www.postgresql.org/docs/9.4/static/pgcrypto.htmlstackoverflow:https://stackoverflow.com/questions/8000740/how-do-i-install-pgcrypto-in-postgresql-9-1-on-windows/46046367#46046367https://st…

php 序列化方法,PHP序列化操作方法分析

本文实例讲述了PHP序列化操作方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;序列化就是将变量数据转换为字符串(跟类型转换机制不同)&#xff0c;一般应用于存储数据(文件)&#xff0c;然后在别的情形下恢复(反序列化)序列化&#xff1a;$val serialize($var);f…

Redis入门到精通-Redis数据类型

2019独角兽企业重金招聘Python工程师标准>>> 登录Redis数据库 [rootlocalhost bin]# /usr/local/redis/bin/redis-cli String类型 ​ String 数据结构是简单的key-value类型&#xff0c;value其实不仅是String&#xff0c;也可以是数字&#xff0c;是包含很多种类型…

装机之 BIOS、EFI与UEFI详解

在我们的电脑中&#xff0c;都有一块黑色的小芯片。但是请千万不要小看它&#xff0c;如果它损坏或者数据错误乱套的话&#xff0c;恭喜&#xff0c;如果不会“救回”这个小芯片&#xff0c;那么这台电脑可以挂闲鱼卖零件了…… 这个小芯片是什么呢&#xff1f;对&#xff0c;…

c/c++笔试题

微软亚洲技术中心的面试题&#xff01;&#xff01;&#xff01; 1&#xff0e;进程和线程的差别。 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度&#xff1a;线程作为调度和分配的基本单位&#xff0c;进程作为拥有资源的基本单位 (2)并发性&…

php 模板 php + mysql + myodbc,连接MySQL数据库在ASP中,就用MyODBC

我们大家都知道ASP与MySQL连接现在应用最为广泛的两种办法是&#xff0c;一是使用组件&#xff0c;经常使用的是MySQL(和PHP搭配之最佳组合)X&#xff0c;可惜价格很贵。另一个就是用MyODBC来连接MySQL数据库&#xff0c;下面我们就来看看第二种方式。 试验的平台&#xff1a; …