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。

相关推荐
Tang1024几秒前
Glide 4.x 版本的图片加载流程
java
振宇i3 分钟前
Java 富文本转word
java·word·富文本·docx4j
李菠菜3 分钟前
Java对象映射利器MapStruct应用详解与实战指南
java
前端 贾公子4 分钟前
详解 LeetCode 第 242 题 - 有效的字母组
算法·leetcode·职场和发展
神仙别闹5 分钟前
基于Java+MySQL 实现(Web)日程管理系统
java·前端·mysql
黯_森7 分钟前
Java异常机制
java·后端
sofaraway1310 分钟前
【多目标进化算法】 MOEA/D算法(知识点)
算法
A阳俊yi31 分钟前
Spring Boot日志配置
java·spring boot·后端
pystraf31 分钟前
UOJ 228 基础数据结构练习题 Solution
数据结构·c++·算法·线段树
苹果酱056731 分钟前
2020-06-23 暑期学习日更计划(机器学习入门之路(资源汇总)+概率论)
java·vue.js·spring boot·mysql·课程设计