ThreadLocal

51 阅读2分钟

blog.csdn.net/huachao1001… blog.csdn.net/huachao1001…

每个线程都有一个属性ThreadLocalMap threadlocals,用于保存当前线程中所有ThreadLocal值 set时,获取当前线程的threadlocals,key为ThreadLocal,value为值,保存到threadlocals中 比如单例类中有3个ThreadLocal,a线程中set值就会保存三个Entry,[thread1, valuea1],[thread2, valuea2],[thread3, valuea3],b线程中也会保存三个Entry,[thread1, valueb1],[thread2, valueb2],[thread3, valueb3],

ThreadLocalMap用于保存数据,而ThreadLocalMap.Entry是弱引用,即GC后会被回收,

ThreadLocalMap.Entry使用弱引用的原因 blog.csdn.net/levena/arti… ThreadLocal为什么会内存泄漏 为什么使用弱引用 blog.xiaohansong.com/2016/08/06/… (需要FQ)

这篇文章最清楚的讲了内存泄漏 blog.csdn.net/xlgen157387…

我突然明白了, 昨天大家给我说的都是弱引用导致内存泄漏的问题, 为什么使用弱引用一直没有说......... 1. 为什么使用弱引用, 因为使用强引用, ThreadLocalMap的生命周期跟Thread一样长,如果没有手动删除对应key就会导致内存泄漏 使用弱引用防止内存泄漏

2. 昨天我误会了弱引用不会被回收, 是错误的. 因为ThreadLocal虽然被ThreadLocalMap引用是弱引用, 但是我的代码中存在对其的强引用, 所以不会回收, 昨晚半仙的测试代码就是重复赋值, 解除了代码中对ThreadLocal的强引用, 故而可以debug到ThreadLocalMap.Entry的referent被回收了... 测试代码, 去除代码中的强引用

3. 昨天的提问出错的原因在于对弱引用的使用不理解, 在这个例子中弱引用是配合强引用, 清楚一些仍然正常存活在生命周期中, 却无法使用的一些变量... 4. 一个问题: 文章中说对于ThreadLocalMap中key为null的Entry,会在下一次set/get时清除掉, 然而我debug发现并没有..

参考文档

一篇文章彻底了解ThreadLocal的原理

一个故事讲明白线程的私家领地:ThreadLocal

面试热门知识点之ThreadLocal

神奇的ThreadLocal - 趣谈编程