ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ThreadLocal学习(四)

2021-04-23 12:59:01  阅读:181  来源: 互联网

标签:CurrentThread ThreadLocalMap 学习 ThreadLocal 引用 Entry 内存


ThreadLocal学习(四)

了解了ThreadLocalMap之后,里面出现了一个名词 “弱引用” ,那么为什么要将这个设置为弱引用而不是设置成强引用呢?

其实主要是因为内存泄露问题,看下面这张图就知道了:

如果是为强引用的话:
在这里插入图片描述
当ThreadLocalRef不再使用ThreadLocal对象并且CurrentThread依然运行情况下,始终有强引用链
CurrentThreadRef—>CurrentThread—>ThreadLocalMap—>Entry—>ThreadLocal,导致Entry(包含ThreadLocal,Value)不会被回收,出现内存泄漏。

如果是为弱引用的话:
在这里插入图片描述
当ThreadLocalRef不再使用ThreadLocal对象并且CurrentThread依然运行情况下,还是始终有强引用链
CurrentThreadRef—>CurrentThread—>ThreadLocalMap—>Entry—>ThreadLocal,导致Entry(包含Value。ThreadLocal由于是弱引用会被直接回收)不会被回收,出现内存泄漏。

那么以上两种都会导致内存泄漏,那为什么还要使用弱引用呢?

事实上,ThreadLocalMap中的ser/getEntry方法中,会对key为null(也就是ThreadLocal)进行判断,如果为null的话,那么是会对value置为null的。

也就相当于用完ThreadLocal,CurrentThread依然运行情况下,就算忘记调用remove方法,弱引用的ThreadLocal会被回收,对应的value在下一次set,get,remove中任意方法执行时被清除,避免内存泄露,不过,最好还是在使用完ThreadLocal后使用remove方法。

标签:CurrentThread,ThreadLocalMap,学习,ThreadLocal,引用,Entry,内存
来源: https://blog.csdn.net/weixin_45921969/article/details/116050370

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有