ThreadLocal 实现原理是什么 & 有哪些引用类型及使用场景?

对于一个 ThreadLocal 对象,通常会有两个引用指向它:

key 是弱引用,当不存在外部强引用时,会被自动回收。而 value 是强引用,引用链如下

所以只有当 Thread 被回收,value 才会被回收,否则 value 将一直存在,但是让每个线程关闭,是不现实的。在线程池中,大部分线程会伴随着系统的整个周期,那么 value 可能会造成泄漏。

解决方法,在 ThreadLocalMap 进行 set(),get(),remove() 的时候,都进行清理:

真正回收 value 的是 expungeStaleEntry() 方法,在 remove 和 set 方法中都会调用这个方法。

ThreadLocal 为了避免内存泄露,不仅使用了弱引用维护 key ,还在每个操作上检查 key 是否被回收,进而再回收value。

1、强引用

2、软引用

3、弱引用

4、虚引用