outlookling

博客园 首页 新随笔 联系 订阅 管理

ThreadLocalMap是作为内部类定义在ThreadLocal中,但是是作为成员变量声明在Thread中。

 

 

 

 

ThreadLocal的set方法,

1.获取当前线程;

2.从当前线程中获取ThreadLocalMap

3.如果map为null,新建一个ThreadLocalMap,赋值给从当前线程中的ThreadLocalMap;

4.如果map不为null,set复制,其中key为ThreadLocal实例,Value为入参;

 

 

 

ThreadLocal内存泄露场景分析:

利用线程池获取5线程,执行run方法;

run方法中定义变量ThreadLocal<String> threadLocalLV= new ThreadLocal();

threadLocalLV.set("1111111");

线程执行完,threadLocal作为局部变量(对应下图中threadLocalLV)会被垃圾回收期回收。

因为Thread中的ThreadLocalMap的entry的key是弱引用,所以也会被垃圾回收;

方法执行完后,因为线程还在线程池中,Thread->ThreadLocalMap->Entry[]->value。value一直都在,这种会导致value一直无法回收;

解决ThreadLocal内存泄露的方法:在线程的run中执行ThreadLocal.get()方法后,执行Thread.remove()方法;删除变量;

 

 

 

 

posted on 2025-05-13 15:54  jsonZhu  阅读(10)  评论(0)    收藏  举报