开头
一说到ThreadLocal很多人就会想到内存泄漏。
但是你们知道他的原理吗?下面讲解一下
首先我们需要了解的是
java中Thread 类中有个Map叫做ThreadLocals
他的key(Entry)继承了WeakReference 弱引用的特性就是下次GC时会回收,也就是随时可能被回收的对象
然后我们回到ThreadLocal类中看到他的get set方法,都是使用自身当key,去当前线程map中找到对应的value
图解
很多人觉得有疑惑?“然后呢?为什么会内存泄漏呢?叭叭这么一大堆完全没听懂”
简单贴一个图辅助理解
解决方法
ThreadLocal的生命周期>=Thread确保ThreadLocals(Map)中的key永远可以拿到
- 对象级别这种级别需要确保此对象在线程回收前都不会被回收,没错就是单例模式
- 类级别这种级别,在类加载的时候就已经初始化了,全局只会有一个
ThreadLocal的生命周期<Thread在ThreadLocal被回收前及时释放ThreadLocals(Map)中的key、value - 使用完之后调用remove方法移除
- ThreadLocals的set方法会自动清除为null的key(无需操作,但是还会有内存泄漏风险)
测试
内存泄漏例子(ThreadLocal数量远大于Thread数)
合理运用ThreadLocal的例子(ThreadLocal数量保持跟Thread数一致)
结语
本文讲解了ThreadLocal的原理,需要了解GC的可达性分析,对象生命周期,4种引用。建议反复观看~