ThreadLocal 实现原理是什么 & 有哪些引用类型及使用场景?
对于一个 ThreadLocal 对象,通常会有两个引用指向它:
key 是弱引用,当不存在外部强引用时,会被自动回收。而 value 是强引用,引用链如下
所以只有当 Thread 被回收,value 才会被回收,否则 value 将一直存在,但是让每个线程关闭,是不现实的。在线程池中,大部分线程会伴随着系统的整个周期,那么 value 可能会造成泄漏。
解决方法,在 ThreadLocalMap 进行 set(),get(),remove() 的时候,都进行清理:
真正回收 value 的是 expungeStaleEntry() 方法,在 remove 和 set 方法中都会调用这个方法。
ThreadLocal 为了避免内存泄露,不仅使用了弱引用维护 key ,还在每个操作上检查 key 是否被回收,进而再回收value。
1、强引用
2、软引用
3、弱引用
4、虚引用