搜索
您的当前位置:首页正文

ThreadLocal使用弱引用的原因

来源:意榕旅游网

ThreadLocal场景:

ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,即变量在线程间隔离而在方法或类间共享的场景,换句话说:ThreadLocal用于线程隔离以及上下文信息传递。

Q1:为什么ThreadLocalMap中的键ThreadLocal<?>是弱引用?

A1:首先先说一下ThreadLocalMap的作用。它是线程隔离的,程序员不能直接获取ThreadLocalMap,而是通过ThreadLocal.set和ThreadLocal.get来设置ThreadLocal维护的变量和获取ThreadLocalMap中的键对应的值。当ThreadLocal失去强引用时,即ThreadLocal=null,如果ThreadLocalMap中的键是强引用的话,会造成GC无法回收ThreadLocalMap中的entry,造成内存泄漏。而弱引用的情况下,当ThreadLocal失去强引用,ThreadLocal只有弱引用在ThreadLocalMap中的entry的键。所以GC就可以回收掉它。

Q2:为什么ThreadLocalMap中的值value不是弱引用?

A2:假如value是弱引用,举例:ThreadLocal.set(333);那这个333是没有强引用的,当gc的时候就会被回收,那么当我想要获取值得时候,也就是ThreadLocal.get()是就返回null了,这就出问题了,因为我们并不想让它回收的。

讲的不太好,因为自己对ThreadLocal得理解不深,而且表达能力差。我就是简单记录一下,如果能帮助到你得理解就最好了。

因篇幅问题不能全部显示,请点此查看更多更全内容

热门图文

Top