如何理解ThreadLocal的Entry继承WeakReference

发布时间:2021-10-09 15:27:08 作者:iii
来源:亿速云 阅读:168

这篇文章主要介绍“如何理解ThreadLocal的Entry继承WeakReference”,在日常操作中,相信很多人在如何理解ThreadLocal的Entry继承WeakReference问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解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”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. Android 中ThreadLocal的深入理解
  2. 彻底理解Java 中的ThreadLocal

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

entry weakreference

上一篇:Python中如何用XGBoost和scikit-learn进行随机梯度增强

下一篇:Python中LazyPredict库的实施以及训练所有分类或回归模型

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》