ThreadLocal是本地线程变量,多线程访问同一个共享变量的时候容易出现并发问题,而使用ThreadLocal变量后,访问这个变量的每一个线程都会有这个变量的一个副本,操作的也是自己本地内存中的变量。
ThreadLocal其实是一个工具类,实际存放本地变量的是Thread类中的一个叫threadLocals的变量,它是ThreadLocalMap类型的,而ThreadLocal本身内部也维护了一个ThreadLocalMap,这个ThreadLocalMap是一个静态内部类,我们使用的get()、set()其实都是调用这个ThreadLocalMap的get()、set()方法,像get()方法的话,它是先去获取当前Thread线程类里面的那个threadLocals变量,但是这个变量默认是null,它只有当第一次调用set()方法的时候,才会去new一个ThreadLocalMap,然后进行get()、set()操作。
这个ThreaadLocalMap内部实际上是一个Entry数组,这个Entry本身也是一个静态内部类,继承了弱引用WeakReference,当前ThreadLocal的引用就是被传递到WeakReference的构造函数中,所以ThreadLocalMap的key就是当前ThreadLocal的弱引用,value就是set()时候设置的值,为强引用,所以如果当前线程还存在,同时这个ThreadLocal变量也没有其他强依赖,那么在发生下一次GC的时候,ThreadLocalMap的key弱引用就会被回收,而value强引用不会被回收,然后就会有一个key为null,value不为null的Entry,就有可能造成内存泄漏。