ThreadLocal的理解

栏目: Java · 发布时间: 5年前

内容简介:Thread有一个ThreadLocalMap.Entry是一个弱引用类型

Thread有一个 ThreadLocal.ThreadLocalMap 类型的threadLocals成员变量,他是一个map,底层是一个 ThreadLocalMap.Entry 的数组,每个 ThreadLocal 变量都有一个 threadLocalHashCode ,根据这个hashcode可计算出当前ThreadLocal在数组的index值。

ThreadLocalMap.Entry是一个弱引用类型 WeakReference> ,Entry的value就是我们需要存储的对象,而key则是一个弱引用的referent,当 ThreadLocal 没有任何强引用时,GC后即使还有弱应用存在也会被回收,这时Entry的key为null。所以即使线程一直活着,只要ThreadLocal不存在任何强引用,就会被回收器回收,避免内存泄漏。

ThreadLocal的理解

那么问题来了,即使Entry的key为弱引用会被回收,但value一直以key为null的Entry保存在map中,这是强引用,永远不会被回收。 ThreadLocalMap 的解决方法是在每次get、set、remove时都会将key为null的entry清除掉,这样就会被垃圾回收器清理了。

为什么不将entry的value也设置为弱引用呢,这是因为如果value是弱引用,执行GC后,若value被清除,那我们永远也拿不到ThreadLocal保存的数据了。

通常实践中,我们常把ThreadLocal做为单例使用,因为我们要保证key为ThreadLocal的值全局都能访问到。当不是单例使用情况下,我们要记得在不实用ThreadLocal时调用一下ThreadLocal.remove()方法,删除key。help gc.


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

自品牌

自品牌

[美] 丹·斯柯伯尔(Dan Schawbel) / 佘卓桓 / 湖南文艺出版社 / 2016-1-1 / 39.80元

什么是自品牌?如何利用新媒体推广自己?如何放大自己的职业优势? 细化到如何巩固“弱联系”人脉?如何在团队里合作与生存?如何开创自己的事业?这些都是职场人不得不面临的问题,但少有人告诉你答案,你需要利用书里分享的高效方法独辟蹊径,把自己变成职场里高性价比的人才。这是一本教你利用新型社交媒体开发职业潜能的自我管理读本,不管你是新人还是老鸟,都可以通过打造自品牌在职场中脱颖而出。如果不甘平庸,就亮......一起来看看 《自品牌》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具