很久以来一直没想明白的一个问题:为什么ThreadLocalMap的key ThreadLocal是弱引用?

网上一堆说内存泄漏的,想不懂为啥?

线程A 用ThreadLocal, 在线程A的Map中 put,用完这个ThreadLocal之后不应该要remove吗?

难道是说为了避免很多人没有remove导致内存泄漏?


回答:

ThreadLocal 很多时候是跨类使用,也不好确定能在什么时候删除。如果能确定的手动删除,最好的方法当然是手动删除,这样基本没有副作用。而弱引用仅仅只是一种面对危机的补偿而已,当threadlocal 没有被任何对象强引用的时候,在下一次垃圾回收的时候会清理掉,但value确没有办法,只能等下次在put的时候执行扫描,来进行清理。无论是哪种不好的情况,都属于内存泄漏吧。


回答:

常见的使用场景都是在拦截器里set和remove的,所以一般也不担心这个事情
所以只是作为一种兜底机制,防内存泄漏


回答:

我理解为当要销毁一个ThreadLocal对象时,如果某个线程的ThreadLocalMap已经存在了这个ThreadLocal对象作为key,如果是强引用,那么则会发生内存泄露,ThreadLocal对象不会被销毁(前提是线程一直持有这个对象)。所以这里设计成弱引用,当下一次GC时就会销毁该对象。
当然在我的工作中并没有遇到过要销毁ThreadLocal对象的时候,我一般用来做缓存使用,所以会持有一个静态的ThreadLocal,就如上面所说的是一种兜底机制吧。

以上是 很久以来一直没想明白的一个问题:为什么ThreadLocalMap的key ThreadLocal是弱引用? 的全部内容, 来源链接: utcz.com/p/944473.html

回到顶部