强引用、软引用、弱引用、虚引用介绍以及ThreadLocalMap

强引用、软引用、弱引用、虚引用介绍以及ThreadLocalMap

首页角色扮演仙傲九霄更新时间:2024-05-11

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