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()方法;删除变量;



浙公网安备 33010602011771号