【JVM篇】ThreadLocal中为什么要使用弱引用

文章目录

🍔ThreadLocal中为什么要使用弱引用

ThreadLocal可以在线程中存放线程的本地变量,保证数据的线程安全

ThreadLocal是这样子保存对象的:

  1. 在每个线程中,存放了一个ThreadLocalMap对象,本质上就是一个数组实现的哈希表,里面存放多个Entry对象
  2. 每个Entry对象继承自弱引用,内部存放ThreadLocal对象,同时用强引用,引用保存的ThreadLocal对应的value值

    下面我们以代码为例

下面我们可以使用get方法,看看刚才保存的value值能不能获取到


当我们不使用ThreadLocal对象的时候,threadlocal=null;由于是弱引用,那么在垃圾回收后,ThreadLocal对象可以被回收


这就体现了弱引用的好处:
在垃圾回收的过程中,假设这个东西只有弱引用关联,那么这个对象是可以被回收的,所以尽管它还在被线程的ThreadLocalMap引用着,它依然可以正常的回收掉。
相反的,如果我们没有使用弱引用,使用了强引用,在我们允许完这段代码后,这个threadlocal仍然不能被回收,这样就造成了内存泄漏问题

但是现在,这个Entry对象和value对象能不能被回收呢?显然是不行的。 因为我们通过ThreadLocal的数组,还是有一个强引用关联到了Entry对象和value值,那么我们可以这么去除掉这一部分数据呢?

在ThreadLocal不再使用的时候,调用remove方法将Entry对象的引用关系去掉,这样子就可以回收掉这2个对象了

⭐总结

在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!

相关推荐
代码游侠几秒前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
mango_mangojuice2 分钟前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
程序员侠客行6 分钟前
Mybatis连接池实现及池化模式
java·后端·架构·mybatis
devmoon9 分钟前
运行时(Runtime)是什么?为什么 Polkadot 的 Runtime 可以被“像搭积木一样”定制
开发语言·区块链·智能合约·polkadot·runtmie
时艰.10 分钟前
Java 并发编程 — 并发容器 + CPU 缓存 + Disruptor
java·开发语言·缓存
丶小鱼丶15 分钟前
并发编程之【优雅地结束线程的执行】
java
市场部需要一个软件开发岗位19 分钟前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
忆~遂愿23 分钟前
GE 引擎进阶:依赖图的原子性管理与异构算子协作调度
java·开发语言·人工智能
沐知全栈开发28 分钟前
API 类别 - 交互
开发语言
MZ_ZXD00128 分钟前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php