如何理解ThreadLocal的Entry继承WeakReference
这篇文章主要介绍“如何理解ThreadLocal的Entry继承WeakReference”,在日常操作中,相信很多人在如何理解ThreadLocal的Entry继承WeakReference问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解ThreadLocal的Entry继承WeakReference”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
创新互联公司专业为企业提供隆德网站建设、隆德做网站、隆德网站设计、隆德网站制作等企业网站建设、网页设计与制作、隆德企业网站模板建站服务,十多年隆德做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
导读:ThreadLocal的Entry为什么要继承WeakReference?弱引用GC的时候会回收?那么回收了,数据不会丢失吗?
首先得看一眼WeakReference
的代码,它继承自Reference
,这里有个get()
方法,代码如下:
注意这一句:
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
,代码在这里:
注意这一句:
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
的实例成员方法,也就是get
、set
、remove
,它们三个方法最后实际上会调用ThreadLocalMap
的getEntry
、set
、remove
这三个方法。
getEntry
有可能通过getEntryAfterMiss
调到expungeStaleEntry
;set
有可能调到replaceStaleEntry
也有可能通过cleanSomeSlots
调到expungeStaleEntry
也有可能通过rehash
调到expungeStaleEntries
再调到expungeStaleEntry
也有可能通过replaceStaleEntry
调到cleanSomeSlots
和expungeStaleEntry
;而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.
expungeStaleEntry
的实现
而Entry
的value
就是在这里被设置为null
的,ThreadLocalMap
中的table
中的Entry
也是在这里被设置为null
的。
那么弱引用的作用是什么呢,只要去 ThreadLocal的
源码搜一下== null
就能发现它出现的每一处都是在对reference
作判断,这代码里就是通过判断reference
来判断Entry
还有用没用的,最需要被GC的就是Entry
中的value
,而ThreadLocal
本身是很小的,它里面只有一个threadLocalHashCode
而已
到此,关于“如何理解ThreadLocal的Entry继承WeakReference”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!
网站名称:如何理解ThreadLocal的Entry继承WeakReference
文章转载:http://azwzsj.com/article/pijcsc.html