当前位置: 首页 > 后端技术 > Java

ThreadLocal内部泄露问题

时间:2023-04-01 20:11:58 Java

ThreadLocalMap内部持有有变化的属性是Entry[]table/***表,根据需要调整大小。*table.length必须始终是2的幂。*/私有条目[]表;/***此哈希映射中的条目扩展了WeakReference,使用*它的主要ref字段作为键(它始终是一个*ThreadLocal对象)。请注意,空键(即entry.get()*==null)意味着不再引用该键,因此可以从表中删除*条目。这些条目在后面的代码中被称为*作为“陈旧条目”。*/staticclassEntryextendsWeakReference>{/**与此ThreadLocal关联的值。*/对象值;条目(ThreadLocal<?>k,对象v){超级(k);值=v;}}根据注解,类Entry继承了WeakReference弱引用类,用ThreadLocal对象作为key,这个key是弱引用的入参。当key对象不再被外部引用时,会被垃圾回收,但value不会被回收。不是引用,只是调用setremoverehash方法,当key判断为null时,删除value/***移除key的条目。*/privatevoidremove(ThreadLocalkey){Entry[]tab=table;intlen=tab.length;inti=key.threadLocalHashCode&(len-1);for(Entrye=tab[i];e!=null;e=tab[i=nextIndex(i,len)]){if(e.get()==key){e.clear();expungeStaleEntry(i);返回;因此,在我们日常的代码编写中,业务处理完成后,调用remove方法清理内存对象。