Java 为什么ThreadLocalMap.Entry会扩展WeakReference?

Java 为什么ThreadLocalMap.Entry会扩展WeakReference?,java,thread-local,Java,Thread Local,我不明白为什么ThreadLocalMap.Entry会扩展WeakReference。 这样做有什么好处? 毕竟,必要时必须调用ADLOCAL.remove()。 如果我们只是将ThreadLocalMap.Entry作为一个普通的结构,比如 {key,value},并且该键是对ThreadLocal的强引用?想象一下。在程序中使用线程池。为了避免并发错误,您经常使用ThreadLocal。当线程完成任务时,您希望GC释放ThreadLocal对象。因此,在你的线程中将其设置为null 嗯。现

我不明白为什么ThreadLocalMap.Entry会扩展WeakReference。 这样做有什么好处? 毕竟,必要时必须调用ADLOCAL.remove()。 如果我们只是将ThreadLocalMap.Entry作为一个普通的结构,比如
{key,value},并且该键是对ThreadLocal的强引用?

想象一下。在程序中使用线程池。为了避免并发错误,您经常使用ThreadLocal。当线程完成任务时,您希望GC释放ThreadLocal对象。因此,在你的线程中将其设置为null

嗯。现在有两种情况。A和B

答:假设ThreadLocalMap中有一个对ThreadLocal的强引用。ThreadLocal对象不会被回收。在回收ThreadLocal对象之前,我们必须等待thread对象被回收。然而,坏消息是线程池经常重用已经创建的线程对象,而不是在线程完成任务后回收它们。因此,我们有越来越多的ThreadLocal对象无法回收,直到JVM没有更多可用内存并抛出OutOfMemoryError,我们的程序崩溃

B:因为条目继承了WeakReference,所以对TreadLocalMap中ThreadLocal对象的引用是弱引用。当线程完成任务时,我们将线程中ThreadLocal的引用设置为null。此时,ThreadLocal对象在ThreadLocalMap中只有一个弱引用。当GC扫描ThreadLocal对象并发现它只有一个弱引用时,它会忽略该弱引用并回收ThreadLocal对象。这就是我们想要的。这就是条目扩展WeakReference的原因

我希望我的回答能帮助你更好地理解^_^