ThreadLocal:
为每个使用该变量的线程提供独立的副本,每个线程都可独立地改变自己的副本,而不影响其它线程的副本。
Thread 类中内部有一个ThreadLocalMap 类型的变量,调⽤ThreadLocal 类的get、set⽅法,实际上是调⽤ ThreadLocalMap 类的get、set⽅法。
最终的变量不是存在ThreadLocal上,而是存在当前线程的ThreadLocalMap中,
ThrealLocal 类可以通过 Thread.currentThread() 获取当前线程对象后,通过 getMap(Thread t) 访问该线程的ThreadLocalMap对象
ThreadLocalMap的key 为当前对象的Thread 对象,值为 Object 对象。
ThreadLocal 内存泄露问题:
ThreadLocalMap 的 key 为ThreadLocal 的弱引⽤,value 是强引⽤。若ThreadLocal 没有被外部强引⽤,垃圾回收时key 会被清理掉,⽽ value 不会。所以ThreadLocalMap 会出现key为null的Entry,则value 永远⽆法被GC 回收,可能会产⽣内存泄露。
所以ThreadLocalMap调⽤set、get、remove⽅法时,会清理掉key为null 的记录。
使⽤完ThreadLocal ⽅法后 最好⼿动调⽤ remove() ⽅法!