前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ThreadLocal的Entry为什么要继承WeakReference?

ThreadLocal的Entry为什么要继承WeakReference?

作者头像
码农架构
发布2021-05-28 17:33:41
1.2K1
发布2021-05-28 17:33:41
举报
文章被收录于专栏:码农架构码农架构

导读: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的实例成员方法,也就是getsetremove,它们三个方法最后实际上会调用ThreadLocalMapgetEntrysetremove这三个方法。

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.

expungeStaleEntry的实现

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档