ThreadLocal(gold_axe)

ThreadLocal

ThreadLocal
ThreadLocal .ThreadLocalMap

ThreadLocalMap是Thread里面一个以ThreadLocal为key的map, 因为一个线程可能有多个ThreadLocal

给ThreadLocal实例set值就是
threadLocal.currentThread.threadLocalMap.set(threadLocal,value)

可以看到, ThreadLocal里面只需要一个field(另外一个是辅助的)就是threadLocalHashCode, 用于它在ThreadLocalMap里面当key的时候作为hash码



ThreadLocal除了一个hash值, 就没其他状态了, 具体的值还是由线程各自保管, ThreadLocal只提供方法

内存泄漏

如果 做这样的操作 threadLocal=null
意图是所有的线程里面都用存以这个theadLocal为key的值了

用软引用避免的 [threadLocal不能垃圾回收]

可以看到 ThreadLocalMap的key是一个弱引用,
这是为了
如果这个ThreadLocal对象已经没有其他引用指向它了,
各个线程里面的ThreadLocalMap不会阻止这个ThreadLocal对象的回收,
就是说, threadLocal=null 这样做的话, 下次垃圾回收会把 threadLocal这个对象回收
class->threadLocal 这个强引用断了 就能回收了
线程->map->key----> threadLocal 这个软引用 不会妨碍回收

还是会泄漏的 value

虽然如此还是可能发生内存泄漏,
threadLocal=null 以后
threadLocal 是能被回收了
但是
线程里面那个map的value 还有引用
线程->ThreadLocalMap的那个原来key是那个threadLocal 的 entity ->里面的value

ThreadLocal对象作为ThreadLocalMap的key确实回收了,但是它对应的value没有被回收!
被线程强引用着!
会一直存在到那个线程结束!
如果线程在线程池里面就永远不会结束! 永远回收不了这个没有用的value

避免内存泄漏

不要 用 threadLocal=null
threadLocal.remove()一下

强引用就不会被回收
没引用的对象回收后,还是不够,就回收软引用
垃圾回收发送就会被回收
gc时通知一下
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇文章写的好了http://duanqz.github.io/2018-03-15-Java-ThreadLoc...
    Tancent阅读 2,607评论 0 2
  • 内容导航 什么是ThreadLocal ThreadLocal的使用 分析ThreadLocal的实现原理 Thr...
    勤奋的码农阅读 5,736评论 1 4
  • 原创文章&经验总结&从校招到A厂一路阳光一路沧桑 详情请戳www.codercc.com 1. ThreadLoc...
    你听___阅读 11,707评论 8 19
  • 江柏文:5.16投资新人必备的四大投资技巧 技巧一:合理的资金管理控制 短线交易的资金计划一般是控制在总资金的10...
    江柏文阅读 910评论 0 0
  • 若挂冠而去不与奸人共事,颜鲁公或可免于身死。然明知不可为而为之,明知山有虎而行之,非名利所驱,忠义之所在,万死不辞也。
    木铎起阅读 1,826评论 0 0