ThreadLocal是如何使用弱引用的?为什么要使用弱引用?
假设 ThreadLocalMap 中的 Key(即 ThreadLocal 对象)是强引用,在一个方法内部创建了一个 ThreadLocal,用完之后,方法结束了,你希望这个 ThreadLocal 对象被回收。问题是 虽然代码中不再引用创建ThreadLocal时的 变量(强引用断开),但当前线程(通常是线程池中的核心线程,生命周期极长)的 ThreadLocalMap 依然持有 ThreadLocal 的另一个强引用。只要线程不挂,ThreadLocal 对象就永远无法被 GC 回收。这就是 Key 的内存泄漏。
所以为了保证当外界不再使用 ThreadLocal 对象时,它能被 GC 正常回收,避免 Key 的内存泄漏,所以把ThreadLocalMap的Key设置为了弱引用。
那Value的内存泄漏如何解决?
遵循“谁创建,谁清理”的原则,在使用完 ThreadLocal 后,务必手动调用remove()方法。
27届毕业生-Java面试专辑 文章被收录于专栏
帮您起飞,助您着陆心仪大厂。
