ThreadLocal 小结
ThreadLocal的原理
- 每个Thread内都维护着一个ThreadLocalMap
- ThreadLocalMap是ThreadLocal的内部类,使用Entry<k,v>来进行存储
- 调用 ThreadLocal的set()方法,,实际是往ThreadLocalMap里设置值,key是ThreadLocal对象,值是传递进来的对象
- 调用ThreadLocal的get()方法时,实际是以ThreadLocal对象为key从ThreadLocalMap获取值
- ThreadLocal对象本身并不存储值,它只是作为一个key来让线程从 ThreadLocalMap获取value
ThreadLocal与内存泄漏
ThreadLocalMap里的key是一个弱引用,如果没有一个其他的强引用指向它,那么这个key将会被GC回收,这样ThreadLocalMap中就会出现key为null但值不为null的Entry。
这个Entry不会被GC回收,因为它一直存在一条强引用链(Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value),从而造成了内存泄漏。只有到线程结束的时候,这个Entry才会被回收。
但是如果使用线程池的话,线程结束是不会被销毁的。所以这个Entry就一直没有被回收,从而造成了内存泄漏。
所以为了避免造成内存泄漏,就要将ThreadLocal对象手动 remove() 掉