如何使用ThreadLocal的正确“姿势”

在这里插入图片描述

开头

一说到ThreadLocal很多人就会想到内存泄漏。
但是你们知道他的原理吗?下面讲解一下
首先我们需要了解的是
java中Thread 类中有个Map叫做ThreadLocals
请添加图片描述
他的key(Entry)继承了WeakReference 弱引用的特性就是下次GC时会回收,也就是随时可能被回收的对象
请添加图片描述
然后我们回到ThreadLocal类中看到他的get set方法,都是使用自身当key,去当前线程map中找到对应的value
请添加图片描述
请添加图片描述

图解

很多人觉得有疑惑?“然后呢?为什么会内存泄漏呢?叭叭这么一大堆完全没听懂”
简单贴一个图辅助理解
在这里插入图片描述

解决方法

ThreadLocal的生命周期>=Thread确保ThreadLocals(Map)中的key永远可以拿到

  1. 对象级别这种级别需要确保此对象在线程回收前都不会被回收,没错就是单例模式
    在这里插入图片描述
  2. 类级别这种级别,在类加载的时候就已经初始化了,全局只会有一个
    在这里插入图片描述
    ThreadLocal的生命周期<Thread在ThreadLocal被回收前及时释放ThreadLocals(Map)中的key、value
  3. 使用完之后调用remove方法移除
  4. ThreadLocals的set方法会自动清除为null的key(无需操作,但是还会有内存泄漏风险)

测试

内存泄漏例子(ThreadLocal数量远大于Thread数)
在这里插入图片描述
合理运用ThreadLocal的例子(ThreadLocal数量保持跟Thread数一致)
在这里插入图片描述

结语

本文讲解了ThreadLocal的原理,需要了解GC的可达性分析,对象生命周期,4种引用。建议反复观看~
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值