关于弱引用的回收时机的疑惑

来源:4-15 收不回来的value

ych_1997

2020-01-11

ThreadLocalMap.Entry中,key为ThreadLocal,这个ThreadLocal是个弱引用,
感觉这个知识是跟虚拟机有交集的,在此请教一下

  1. JVM在什么时机下判断 ThreadLocal 这个引用不再使用了,以下的情况会GC吗?
    1.1 情况一:线程池阻塞等待任务
    1.2 情况二:service调用链有同步操作,线程较长时间阻塞

  2. 线程池核心线程正在阻塞等待队列,此时Thread中的ThreadLocalMap对象会不会GC?
    2.1 如果会GC
    如果GC触发,线程池就失去了 set(object) 的object
    我可不可以认为
    线程池的场景,就算ThreadLocalMapGC,
    重写initialValue()方法,get的时候可以重设一个object进去,
    这个object应该是无状态的,如工具类SimpleDateFormat依旧保证业务逻辑健壮

写回答

1回答

悟空

2020-01-11

无论是线程怎么阻塞,都不代表这个线程会被回收,ThreadLocal也不会被回收。

判断回收的条件,主流是引用可达法法,程序运行从开始,每次引用对象,都将对引用的对象进行连接起来,到最后形成一张网,没有在这张网上的对象则被认为是垃圾对象。 

线程阻塞是不影响这张网的。


ThreadLocalMap是Thread的成员变量,是强引用,所以也是不会被回收的。

1
3
ych_1997
非常感谢!
2020-01-14
共3条回复

深度解密Java并发工具,精通JUC,成为并发多面手

JUC全方位讲解,构建并发工具类知识体系

1599 学习 · 573 问题

查看课程