ThreadLocal简单的总结

每个线程都有一个threadLocals对象 其实质是一个链表
链表的每个元素就是一个entry,这个entry的key是WeakReference<threadlocal>,value则是我们设置值
所以这就意味着 当我们设置多个threadlocal对象则在thread的threadLocals中就有多个entry。
因为entry的key是弱引用,其会在jvm发生gc(无论是minor ,major,full gc)之后被回收。
内存泄漏
1.比如我们的key 因为gc 被回收 但是value 则永远无法在访问
解决方案:在ThreadLocal的get(),set(),remove()的时候都会清除线程ThreadLocalMap里所有key为null的value。

2.就是我们的线程一直不结束,且也一直不使用上述三个方法的api,或者就算使用了get和set但是一直 没使用remove 而在此期间key也没有回收,这就导致这个内存一值被占用。

猜你喜欢

转载自blog.csdn.net/weixin_34129145/article/details/87461945