ThreadLocal

每个 Thread 对象中都持有一个 ThreadLocalMap 类型的成员变量

原理:

为什么只定义了一个ThreadLocal成员,不同的Thread使用此成员的set和get确可以相互分离?

因为实际是调用的每个Thread自己内部的ThreadLocalMap的set和get,键都是这个ThreadLocal的弱引用

 

Thread类里面:

 

 

这里需要重点看到它们的数量对应关系:一个 Thread 里面只有一个ThreadLocalMap ,而在一个 ThreadLocalMap 里面却可以有很多的 ThreadLocal,每一个 ThreadLocal 都对应一个 value。因为一个 Thread 是可以调用多个 ThreadLocal 的,所以 Thread 内部就采用了 ThreadLocalMap 这样 Map 的数据结构来存放 ThreadLocal 和 value

 

ThreadLocalMap是ThreadLocal的静态内部类

 

ThreadLocal 内存泄露

ThreadLocalMap 中使⽤的 key 为 ThreadLocal 的弱引⽤,⽽ value 是强引⽤。所以,如果 ThreadLocal 没有被外部强引⽤的情况下,在垃圾回收的时候,key 会被清理掉,⽽ value 不会被 清理掉。这样⼀来, ThreadLocalMap 中就会出现key为null的Entry。假如我们不做任何措施的话, value 永远⽆法被GC 回收,这个时候就可能会产⽣内存泄露。ThreadLocalMap实现中已经考虑了这种 情况,在调⽤ set() 、 get() 、 remove() ⽅法的时候,会清理掉 key 为 null 的记录。使⽤完 ThreadLocal ⽅法后 最好⼿动调⽤ remove() ⽅法。

posted @ 2021-09-22 11:23  忙碌了一整天的L师傅  阅读(34)  评论(0编辑  收藏  举报