ThreadLocal使用弱引用的原因

不要看下面内容了,直接看yes大佬的文章

threadLocal 中为什么使用弱引用 https://mp.weixin.qq.com/s/bECVeuxE-WIYmvXbF2V3QA

为什么ThreadLocalMap和HashMap的key不同,会设计成弱引用呢?我们来分析一下:

  • HashMap被程序员使用存储各类数据,ThreadLocalMap为静态访问修饰符为Default的类,只为线程Thread存储数据(其属性)。

  • 看一下类注释:To help deal withvery large and long-lived usages, the hash table entries use WeakReferences for keys。解释一下:为了帮助处理巨大和长时间存活的对象使用,才会使用弱引用。

所以总结上面两点,我们就知道。ThreadLocalMap不像HashMap一样被外部使用,可以认为是线程私有的Map,这就意味着:在线程长时间存活的情况下,如果ThreadLocalMap没有使用弱引用,而是使用HashMap的话。当Map中被放入大量大对象和值时,又不及时手动删除K-V的话就很可能会出现应用堆栈溢出的情况。但是如果使用弱引用的话,那么在没有其他强引用的时候,就不需要程序员手动去删除K-V,再一定程度上会降低堆栈溢出的风险(要是KEY都被外部强引用,那也没办法啊)。

ThreadLocalMap的每次get、set、remove,都会清理过期的Entry,如果不调用remove则会导致value不会被GC回收

ThreadLocalMap的每次get、set、remove,都会清理过期的Entry(key为null的entry)

参考文档:

https://www.cnblogs.com/-beyond/p/13125195.html#ask

https://segmentfault.com/a/1190000024549972

 

posted on 2021-06-16 16:02  努力学习的菜鸡  阅读(2855)  评论(0编辑  收藏  举报

导航