ThreadLocal如何回收value,什么时候回收?(学习笔记)

https://www.cnblogs.com/1693977889zz/p/11111568.html

1)ThreadLocal如何回收value,什么时候回收?
从ThreadLocal中的内部类分析:

static class ThreadLocalMap {/*** The entries in this hash map extend WeakReference, using* its main ref field as the key (which is always a* ThreadLocal object).  Note that null keys (i.e. entry.get()* == null) mean that the key is no longer referenced, so the* entry can be expunged from table.  Such entries are referred to* as "stale entries" in the code that follows.*/......}

ThreadLocalMap是一个定制的哈希映射,仅适用于维护线程本地值。为了帮助处理非常大和长期使用的用法,哈希表条目使用weakreferences作为键。但是,由于不使用引用队列,因此只有当表开始耗尽空间时,才保证删除过时的条目。(源码注释)

 static class Entry extends WeakReference<ThreadLocal<?>> {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;}}

ThreadLocalMap是使用ThreadLocal的弱引用作为Key的(注意:Value并非弱引用),Key只能是ThreadLocal对象,从而实现了变量访问在不同线程中的隔离。当一个ThreadLocal失去强引用,生命周期只能存活到下次gc前,此时ThreadLocalMap中就会出现key为null的Entry,当前线程无法结束,这些key为null的Entry的value就会一直存在一条强引用链,造成内存泄露。
解决方案:
建议将ThreadLocal变量定义成private static的,在调用ThreadLocal的get()、set()方法完成后,再调用remove()方法,手动删除不再需要的ThreadLocal。

2)ThreadLocal为什么会产生脏数据?
因为Thread Pool是一把双刃剑,好处略,坏处之一:
如果Thread是从Thread Pool中取出,它可能会被复用,此时就一定要保证这个Thread在上一次结束的时候,其关联的ThreadLocal被清空掉,否则就会串到下一次使用。

ThreadLocalMap的enrty的key为什么要设置成弱引用

ThreadLocalMap的Enrty代码实现:

将Entry的Key设置成弱引用,在配合线程池使用的情况下可能会有内存泄露的风险。之设计成弱引用的目的是为了更好地对ThreadLocal进行回收,当我们在代码中将ThreadLocal的强引用置为null后,这时候Entry中的ThreadLocal理应被回收了,但是如果Entry的key被设置成强引用则该ThreadLocal就不能被回收,这就是将其设置成弱引用的目的

https://blog.csdn.net/weixin_34162401/article/details/86024140

ThreadLocalMap的enrty的key为什么要设置成弱引用相关推荐

  1. Redis源码分析:过期key删除与设置key的过期时间

    Redis中设置key过期时间与过期key的处理流程 在Redis中,可以再设置值的时候就设置该Key的过期时间,也可以通过在expire命令来设置某个key值的过期时间,并且在了解完设置过期时间之后 ...

  2. fastjson 添加key value_Redis中设置了过期时间的Key,那么你还要知道些什么?

    来源:http://i7q.cn/4NHBun 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 1. DEL/SET/GE ...

  3. 主键(primary key)的设置和添加

    主键(primary key)的设置和添加 1.先创建了表,往表里添加主键 mysql> alter table user-> add primary key(useID); 2.创建表时 ...

  4. sqlserver2008未将对象引用设置到对象的实例_面试官:ThreadLocal 的内存泄漏是弱引用导致的,你确定?...

    面试官:ThreadLocal 了解吗? Python 小星:线程局部变量,多线程下能保证各个线程的变量相对独立于其他线程的变量. 面试官:那你说下它是如何保证线程隔离的? Python 小星:每个线 ...

  5. antd中表格的字段设置成掩码

    如上图所示,是一个利用antd制作的一个表格,现在讲微信里面的字段设置成掩码格式. 代码: const columns = [{title: '用户编号',dataIndex: 'originalId ...

  6. 原创 | 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?...

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 254篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) 在Java基础中,集合 ...

  7. 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?

    在Java基础中,集合类是很关键的一块知识点,也是日常开发的时候经常会用到的.比如List.Map这些在代码中也是很常见的. 个人认为,关于HashMap的实现,JDK的工程师其实是做了很多优化的,要 ...

  8. ThreadLocalMap里弱引用

    要回答ThreadLocalMap里弱引用,我们需要弄清者三个问题 第一个问题,我们先来看看引用相关的.其实Java中一直有争论关于值传递与引用传递(就我看到的百度是这样的).我们先来看看代码. pu ...

  9. 将笔记本电脑设置成WiFi无线上网共享热点

    将笔记本电脑设置成WiFi无线上网共享热点 64 Replies 原文链接    https://tumutanzi.com/archives/3440 更新:此文教程针对Ubuntu Linux操作 ...

最新文章

  1. 程序员必知的7种软件架构模式
  2. python进制转换函数汇总-攻防世界-Misc-掀桌子;
  3. Tkinter的Text组件
  4. 未能加载文件或程序集“Antlr3.Runtime”或它的某一个依赖项。参数错误。 (异常来自 HRESULT:0x80070057 (E_INVALIDARG))解决方法。...
  5. 多核CPU缓存一致性协议MESI
  6. NYOJ 46 最少乘法次数
  7. java捕捉sql执行异常_如何捕获java.sql.SQLIntegrityConstraintViolationException?
  8. 智慧交通管理和服务平台系统集成解决方案
  9. 制造企业年终仓库盘点有哪些好的方法
  10. 卡内基梅隆计算机专业排名,2019年卡内基梅隆大学计算机专业排名多少?
  11. p2psear正在连接服务器,P2PSearcher无法连接到网络,也无法连接到服务器
  12. 如何用python计算圆周率_如何用python计算圆周率?
  13. xcode 10.3 for Mac
  14. 写需求规格说明书/产品定义的个人总结
  15. 教学管理系统的设计与实现(一)(源码,以及毕业论文)
  16. 分布式事务框架seata介绍
  17. PHP网站升级https后如何引用http直播源hls?
  18. 简单的Python五子棋
  19. dex是什么的缩写,游戏中str是什么的缩写《游戏人物的属性STR AGI VIT INT DEX CON WIS LUK各是什么意思啊?》...
  20. 深度学习花书学习感悟之第三章概率论

热门文章

  1. python aipspeech_Python调用百度API实现语音识别(二)
  2. 鸿蒙程序如何上传,鸿蒙应用程序流转的实现
  3. python计算无穷级数求和常用公式_无穷级数-从入门到火葬
  4. github 修改项目为public_GitHub仓库中项目的语言属性可以这样修改,有点简单
  5. linux远程登录键盘反应慢,通过OpenSSH远程登录时的延迟问题解决
  6. skiller v3 beta2_S10全球总决赛:赛前叫嚣却遭打脸!V3被LGD踢出S10,日本撸友彻底炸锅:真是悲哀...
  7. 隔空投送所有人安全吗_Find X2将采用2K+120Hz屏幕,支持65W;安卓将拥有“隔空投送”;“杀毒霸主”Avast被曝偷卖4.35亿用户数据;...
  8. npc一定不能多项式时间内解决吗_P, NP, NPC 和 NPhard
  9. 【c语言】蓝桥杯算法训练 成绩的等级输出
  10. 【c语言】蓝桥杯算法训练 大小写判断