V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
BraveXaiver
V2EX  ›  Java

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

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

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

    谢谢
    4 条回复    2025-06-27 11:57:07 +08:00
    butanediol2d
        1
    butanediol2d  
       13 天前
    个人理解,这里所说的 ThreadLocalMap Key/Value 的强弱引用,指的是 ThreadLocalMap.Entry 对 Key/Value 的强弱引用,K/V 的实际生命周期还受其他对象引用的影响。

    如果 Entry 对 Value 也是弱引用,那么假设还有其他对象持有对 Key 的强引用,但是没有其他对象持有对 Value 的弱引用,那有可能 GC 把 Value 回收了,再通过 Key 去取 Value 的时候返回 null 。
    butanediol2d
        2
    butanediol2d  
       13 天前
    补丁:但是没有其他对象持有对 Value 的*强引用*
    xtreme1
        3
    xtreme1  
       13 天前
    ThreadLocalRef -> ThreadLocal ···> key
    CurrentThreadRef -> CurrentThread -> ThreadLocalMap -> Entry -> value
    guyeu
        4
    guyeu  
       12 天前
    本来 ThreadLocalMap.Entry.就已经是弱引用了呀,再套一层弱引用非但没有实际意义,反而会需要额外的处理来避免哈希表的引用和键值对的引用状态不一致而导致出错。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5168 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 03:39 · PVG 11:39 · LAX 20:39 · JFK 23:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.