为什么使用ThreadLocal后要调用remove()方法呢?
ThreadLocalMap中包含一个数组,每个节点对应的类名叫Entry,这个类继承WeakReference<ThreadLocal<?>>,entry中有两个属性:key和value。特别需要指出的是key来自于父类中的threadLocal对象。
为了避免内存泄露,使用玩ThreadLocal后,一定要调用它的remove()方法,这样才能保证用完这块entry所占用的内存后,尽早的释放掉内存,最大限度的提高内存的利用率。
虽然ThreadLocal的set()、get()方法也可能会扫描并释放掉这块内存,或者需要很长时间才能释放掉,说不定在这段时间内,内存已经不够用了,出现OOM错误了,所以这种方式是不可靠的。因为使用这种方式的前提条件是GC清理的比较及时、执行set()、get()方法时恰巧能发现这个过期的entry,这样才能保证过期entry对象被及时清理。
清理时,ThreadLocalMap中包含一个名字类似叫cleanup方法,只需要调用这个方法就可以啦。方法里面的操作就是将
entry.value = null;
entry = null;
这样的话,就不会再引用对应的对象了。下一轮GC来临时,就会把这俩对象清理掉啦,美滋滋。