Java 中 ThreadLocalMap 里对值的引用为什么不是弱引用?难道会出现 ThreadLocalMap.Entry.Key 也就是 ThreadLocal 应当销毁,但值不应当销毁的情况?

15 天前
 BraveXaiver
因为 ThreadLocalMap.Entry.Key 和 ThreadLocalMap.Entry.Value 前者是弱引用后者是强引用,因此可能出现前者被 GC 回收掉了后者还在的情况对吧?可是这种情况有什么意义呢?前者都销毁了那怎么获得,以及还有谁在乎后者的值呢?

既然如此那后者不应该也一起被回收,进而使用弱引用?

谢谢
1003 次点击
所在节点    Java
4 条回复
butanediol2d
15 天前
个人理解,这里所说的 ThreadLocalMap Key/Value 的强弱引用,指的是 ThreadLocalMap.Entry 对 Key/Value 的强弱引用,K/V 的实际生命周期还受其他对象引用的影响。

如果 Entry 对 Value 也是弱引用,那么假设还有其他对象持有对 Key 的强引用,但是没有其他对象持有对 Value 的弱引用,那有可能 GC 把 Value 回收了,再通过 Key 去取 Value 的时候返回 null 。
butanediol2d
15 天前
补丁:但是没有其他对象持有对 Value 的*强引用*
xtreme1
14 天前
ThreadLocalRef -> ThreadLocal ···> key
CurrentThreadRef -> CurrentThread -> ThreadLocalMap -> Entry -> value
guyeu
14 天前
本来 ThreadLocalMap.Entry.就已经是弱引用了呀,再套一层弱引用非但没有实际意义,反而会需要额外的处理来避免哈希表的引用和键值对的引用状态不一致而导致出错。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1141413

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX