一文了解ThreadLocal

什么是ThreadLocal?

ThreadLocal是每个线程私有的,线程可以把自己的私有数据放到ThreadLocal里面,不用担心其他线程访问到自己ThreadLocal。

通过set()方法将值存入ThreadLocal或者修改值,get()方法取出值,remove()方法移除值。

ThreadLocal原理

ThreadLocal类中有一个内部类ThreadLocalMap,它其实就是一个哈希表,当我们往ThreadLocal里面存数据的时候,会通过当前线程得到ThreadLocalMap,以当前ThreadLocal为key,我们set的值为value,存入到ThreadLocalMap这个哈希表中。

如果我们在当前线程定义了多个ThreadLocal,他会存放到唯一的ThreadLocalMap中。

ThreadLocal内存泄露问题

我们知道往ThreadLocal里存放数据时,会存放到ThreadLocalMap中,key是ThreadLocal,value是我们设置的值。但是存放key的时候,不是直接存放的ThreadLocal对象本身,而是存放ThreadLocal的一个弱引用,而value是存放的强引用。在GC时,弱引用被垃圾回收器检查到就会直接回收,而如果线程一直存活的话,这个value也就一直还存在。

避免方法就是在使用完了ThreadLocal之后,一定要用remove方法移除值。

相关推荐
后端AI实验室32 分钟前
我把一个生产Bug的排查过程,交给AI处理——20分钟后我关掉了它
java·ai
凉年技术3 小时前
Java 实现企业微信扫码登录
java·企业微信
狂奔小菜鸡3 小时前
Day41 | Java中的锁分类
java·后端·java ee
hooknum4 小时前
学习记录:基于JWT简单实现登录认证功能-demo
java
程序员Terry4 小时前
同事被深拷贝坑了3小时,我教他原型模式的正确打开方式
java·设计模式
NE_STOP4 小时前
MyBatis-缓存与注解式开发
java
码路飞5 小时前
不装 OpenClaw,我用 30 行 Python 搞了个 QQ AI 机器人
java
Re_zero5 小时前
以为用了 try-with-resources 就稳了?这三个底层漏洞让TCP双向通讯直接卡死
java·后端
SimonKing5 小时前
Fiddler抓包完全指南:从安装配置到抓包,一文讲透
java·后端·程序员
磊磊落落6 小时前
如何将 Spring Statemachine 作为一个轻量级工作流引擎来使用?
java