ThreadlocalMap 中key是 WeakReference类型,能讲讲Java中有几种类似的引用,什么区别吗?
那你能讲讲为什么ThreadlocalMap 中key 设计成 WeakReference(弱引用)类型吗?
为了尽最大努力避免内存泄漏。请看上图
privatestaticfinalThreadLocal<UserInfo>userInfoThreadLocal=newThreadLocal<>();
userInfoThreadLocal.set(userInfo);
这里的引用关系是userInfoThreadLocal 引用了ThreadLocal对象,这是个强引用,ThreadLocal对象同时也被ThreadlocalMap的key引用,这是个WeakReference引用,我们前面说GC要回收ThreadLocal对象的前提是它只被WeakReference引用,没有任何强引用。
为了方便大家理解弱引用,我写了段Demo程序
public static void main(String[] args) {
Object angela = new Object();
//弱引用
WeakReference<Object> weakReference = new WeakReference<>(angela);
//angela和弱引用指向同一个对象
System.out.println(angela);//java.lang.Object@4550017c
System.out.println(weakReference.get());//java.lang.Object@4550017c
//将强引用angela置为null,这个对象就只剩下弱引用了,内存够用,弱引用也会被回收
angela = null;
System.gc();//内存够用不会自动gc,手动唤醒gc
System.out.println(angela);//null
System.out.println(weakReference.get());//null
}
可以看到一旦一个对象只被弱引用引用,GC的时候就会回收这个对象。
所以只要ThreadLocal对象如果还被 userInfoThreadLocal(强引用) 引用者,GC是不会回收被WeakReference引用的对象的。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved