原理
- ThreadLocal中真正保存的值还是在线程的ThreadLocalMap中,ThreadLocal只是使用它的hashcode值充当中间计算变量,
每一个线程都有自己的ThreadLocalMap
- ThreadLocalMap内部使用一个Entry数组保存数据,Entry的key弱引用指向ThreadLocal的实例,value用来存储数据
内存泄漏
- 当ThreadLocal的实例被回收后,使用过ThreadLocal的线程如果没有被回收,则会出现内存泄漏(ThreadLocalMap内的Entry的key是弱引用会被gc回收,但是这样value就一直不能被访问到了,直到线程被回收)
为什么使用弱引用
- 如果key使用强引用,那么ThreadLocal的实例被手动销毁后(比如置为null),但是不能被gc回收