请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,请问一下弱引用的问题

我可以理解在threadLocals这张map中的key是弱引用,如果没有强引用存在,key引用的内存会被回收,但有个地方不明白
为了能够使用到某个ThreadLocal对象threadLocalObj,外面肯定有个类中包含了这个static变量:
例如类A中有:public static ThreadLocal threadLocalObj = new ThreadLocal<>();
那么当类A加载的时候,就会new出这个ThreadLocal对象,且threadLocalObj指向这个对象的引用,这是个强引用。
当把这个对象set到threadLocals这个map中时:
A.threadLocalObj.set(Value);
此时在map中保存的Entry里,key虽然是指向这个ThreadLocal对象的弱引用,但是类A中的threadLocalObj作为static始终是存在的,而且类A中的threadLocalObj和Entry中的key都是指向这个ThreadLocal对象的引用,那我觉得既然有一个是强引用,这个ThreadLocal对象也就应该不会被回收呀。

正在回答

1回答

没错的,你分析的很对。通常是不会被回收的。

只有当我们不想要这个ThreadLocal的时候,我们会把它设置为null,这时,强引用消失,它被回收。

1 回复 有任何疑惑可以回复我~
  • 悟空老师,我们的代码里为啥没有把threadlocal设置为null的操作呢
    回复 有任何疑惑可以回复我~ 2020-08-06 18:51:33
  • 悟空 回复 sadcloud #2
    一般用remove清除value就可以了。或者如果是普通线程,那么会被自动回收
    回复 有任何疑惑可以回复我~ 2020-08-07 01:32:04
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信