ThreadLocal使用弱引用的原因

threadLocal 中为什么使用弱引用

为什么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

心有多大,天有多高,一起奋斗!!
原文地址:https://www.cnblogs.com/zhaolei1996/p/14889765.html