还是没明白key是什么样的情况下才变成null的

还是没明白key是什么样的情况下才变成null的

public static ThreadLocal<Object> threadLocal = new ThreadLocal(){ ... };

1、上面代码是一个强引用吧?它引用了一个ThreadLocal对象。

既然有强引用,垃圾回收器又怎么会回收这个key呢?


2、被垃圾回收器回收后,弱引用会自动变为null?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,

1、每个Thread线程内部都维护一个ThreadLocalMap字典数据结构,字典的Key值是ThreadLocal。

ThreadLocalMap使用ThreadLocal的弱引用作为key,如果一个ThreadLocal没有外部强引用来引用它,那么系统GC垃圾回收的时候,这个ThreadLocal就会被回收。

2、ThreadLocal对象在主线程中并没有持有强引用哦。这涉及了一些底层的知识,现阶段同学同学不用太关注,在有了一定的基础后,再来深入研究可能会更好一些呐。

好帮手慕阿慧 2020-10-22 13:53:57

同学你好,

1、上面代码是一个强引用。

ThreadLocal类中有ThreadLocalMap类。ThreadLocalMap类中Entry内部类,Entry类的构造方法中key是ThreadLocal类型,是弱引用。如下:

http://img1.sycdn.imooc.com/climg/5f911d8b09964c6e07130456.jpg

如果一个对象只被弱引用关联,相当于这个对象没有被引用。当垃圾回收器回收垃圾时,就会将这个对象回收。

2、被垃圾回收器回收后,弱引用会自动变成null。

  • 提问者 易萧 #1
    那一个ThreadLocal对象都是在主线程中持有强引用的吧,总不可能是匿名的吧,只被弱引用基本上不太可能发生,除非确定后面的业务逻辑都不再需要它,手动置空。
    2020-10-22 14:35:26
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师