ThreadLocal的Entry为什么要继承WeakReference?

导读:ThreadLocal的Entry为什么要继承WeakReference?弱引用GC的时候会回收?那么回收了,数据不会丢失吗?

ThreadLocal的Entry为什么要继承WeakReference?

 

ThreadLocal的Entry为什么要继承WeakReference?

首先得看一眼WeakReference的代码,它继承自Reference,这里有个get()方法,代码如下:

 

ThreadLocal的Entry为什么要继承WeakReference?

注意这一句:

If this reference object has been cleared, either by the program or by the garbage collector, then this method returns null.

也就是说,referent这个字段会在GC时被修改,而它经过GC后会变成null

再看问题中说的这个Entry,代码在这里:

ThreadLocal的Entry为什么要继承WeakReference?

注意这一句:

Note that null keys (i.e. entry.get() == null) mean that the key is no longer referenced, so the entry can be expunged from table.

这时得注意一件事,刚才提到ThreadLocal被GC后Entry中的reference就会变为null,但是呢, Entry毕竟也是个对象,它除了会在GC时被改一下reference以外平平无奇,那么这里的value啥时候销毁呢?

反正不会随着ThreadLocal一起被删就对了,甚至它能不能被销毁都是个问题。GC线程是不可能在改reference时顺便改value的,所以这个value只能是被咱自己删。

那么就来看看ThreadLocal仅有的三个public的实例成员方法,也就是getsetremove,它们三个方法最后实际上会调用ThreadLocalMapgetEntrysetremove这三个方法。

ThreadLocal的Entry为什么要继承WeakReference?

 

ThreadLocal的Entry为什么要继承WeakReference?ThreadLocal的Entry为什么要继承WeakReference?

 

getEntry有可能通过getEntryAfterMiss调到expungeStaleEntryset有可能调到replaceStaleEntry也有可能通过cleanSomeSlots调到expungeStaleEntry也有可能通过rehash调到expungeStaleEntries再调到expungeStaleEntry也有可能通过replaceStaleEntry调到cleanSomeSlotsexpungeStaleEntry;而remove也会调到expungeStaleEntry

总之,条条大路通罗马,最后十有八九会跑到expungeStaleEntry里头,而实际上这件事人家作者写注释的时候其实早就提醒过咱们了:

Note that null keys (i.e. entry.get() == null) mean that the key is no longer referenced, so the entry can be expunged from table.Such entries are referred to as "stale entries" in the code that follows.

ThreadLocal的Entry为什么要继承WeakReference?

expungeStaleEntry的实现

ThreadLocal的Entry为什么要继承WeakReference?

Entryvalue就是在这里被设置为null的,ThreadLocalMap中的table中的Entry也是在这里被设置为null的。

那么弱引用的作用是什么呢,只要去 ThreadLocal的源码搜一下== null就能发现它出现的每一处都是在对reference作判断,这代码里就是通过判断reference来判断Entry还有用没用的,最需要被GC的就是Entry中的value,而ThreadLocal本身是很小的,它里面只有一个threadLocalHashCode而已

首发地址:ThreadLocal的Entry为什么要继承WeakReference?

版权声明:玥玥 发表于 2021-05-16 0:38:19。
转载请注明:ThreadLocal的Entry为什么要继承WeakReference? | 女黑客导航