ThreadLocal的理解

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

ThreadLocalMap.Entry是一个弱引用类型 WeakReference<ThreadLocal<?>> ,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.

原文 

https://segmentfault.com/a/1190000018087499

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » ThreadLocal的理解

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址