来自 javadoc
只要线程处于活动状态并且 ThreadLocal 实例可访问,每个线程都持有对其线程局部变量副本的隐式引用;在线程消失后,它的所有线程本地实例副本都将受到垃圾回收(除非存在对这些副本的其他引用)。
由此看来,由 ThreadLocal 变量引用的对象仅在线程死亡时才会被垃圾收集。但是,如果 ThreadLocal 变量a
不再被引用并且是垃圾收集的对象呢?如果持有的线程仍然存在,那么仅由变量引用的对象a
是否会受到垃圾回收?a
例如,有以下带有 ThreadLocal 变量的类:
public class Test {
private static final ThreadLocal a = ...; // references object b
}
这个类引用了一些对象,而这个对象没有其他对它的引用。然后在上下文取消部署应用程序类加载器成为垃圾收集的主题,但线程来自线程池,因此它不会死。对象b
会成为垃圾收集的对象吗?