ThreadLocalMap 的 Entry 继承了 WeakRefrence<ThreadLocal>。
为什么这样子?
有人说是为了防止内存泄漏,但是没有给出怎样情况下会发生内存泄漏。
有木有大神可以详细分析一下WeakRefrence的作用,还有Entry为什么要继承WeakRefrence。
继承一个WeakRefrence 又是什么个意思?
ThreadLocalMap 的 Entry 继承了 WeakRefrence<ThreadLocal>。
为什么这样子?
有人说是为了防止内存泄漏,但是没有给出怎样情况下会发生内存泄漏。
有木有大神可以详细分析一下WeakRefrence的作用,还有Entry为什么要继承WeakRefrence。
继承一个WeakRefrence 又是什么个意思?
ThreadLocal
是为线程中的对象服务的。ThreadLocalMap
中保存的是当前线程中的ThreadLocal
对象所引用的其他对象。
当ThreadLocal
对象不再使用的时候,最好把它从ThreadLocalMap
中的Entry
对象中删掉,以免引起内存泄露。WeakRefrence
正好适合这种场景。
比如有下面这个对象:
public class Foo {
private ThreadLocal tl = ...
......
}
当Foo
对象中的tl
不再使用的时候,应该让垃圾回收器把tl
回收掉。但是如果不使用WeakRefrence
,那么当前线程上的ThreadLocalMap
中就会有一个Entry
引用着tl
对象,导致垃圾回收器无法回收tl
,除非线程结束,这样就存在内存泄露的风险。
将实体中的ThreadLocal
对象通过WeakRefrence
来引用,当tl
对象不再使用的时候,WeakRefrence
中的引用会自动断开,这样就不会阻止垃圾回收了。
15 回答11.9k 阅读✓ 已解决
7 回答2.5k 阅读
8 回答2.9k 阅读✓ 已解决
9 回答1.8k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
7 回答1.6k 阅读
3 回答1.6k 阅读✓ 已解决
看一个例子