ThreadLocal 小结

ThreadLocal的原理

  1. 每个Thread内都维护着一个ThreadLocalMap
  2. ThreadLocalMap是ThreadLocal的内部类,使用Entry<k,v>来进行存储
  3. 调用 ThreadLocal的set()方法,,实际是往ThreadLocalMap里设置值,key是ThreadLocal对象,值是传递进来的对象
  4. 调用ThreadLocal的get()方法时,实际是以ThreadLocal对象为key从ThreadLocalMap获取值
  5. 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() 掉