ThreadLocal

1.每条线程都有一个ThreadLocalMap对象,而可以有多个threadlocal对象存放在map中。

2.放在map中的key是WeakReference<ThreadLocal<?>>,也就是ThreadLocal的弱引用。

3.ThreadLocalmap会把那些过期的key设置为null,并且删除那些key为null的值。

4.ThreadLocalmap的key是弱引用,也就是说弱引用在没有被其他强引用所引用,gc就会回收。而value是强引用,如果用线程池技术,该线程一直没有结束,value一直没办法被回收。所以key为null的entry的value就一直占据内存,造成内存泄露。

5.因为上述的原因,在ThreadLocal这个类的get()、set()、remove()方法,均有实现回收 key 为 null 的 Entry 的 value所占的内存。所以,为了防止内存泄露(没法访问到的内存),在不会再用ThreadLocal的线程任务末尾,调用一次 上述三个方法的其中一个即可,一般使用remove。

相关推荐
one_love_zfl几秒前
java面试-微服务组件篇
java·微服务·面试
一只大袋鼠3 分钟前
Java进阶:CGLIB动态代理解析
java·开发语言
环流_17 分钟前
HTTP 协议的基本格式
java·网络协议·http
爱滑雪的码农18 分钟前
Java基础十三:Java中的继承、重写(Override)与重载(Overload)详解
java·开发语言
【 】42322 分钟前
C++&STL(Standard Template Library,标准模板库)
java·开发语言·c++
茉莉玫瑰花茶22 分钟前
LangChain 核心组件 [ 2 ]
java·数据库·langchain
Wect33 分钟前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·算法·typescript
信徒_36 分钟前
ID 生成技术选型
java
糖果店的幽灵36 分钟前
决策树详解与sklearn实战
算法·决策树·sklearn
Lewiis39 分钟前
趣谈排序算法
算法·排序算法