什么是ThreadLocal?
ThreadLocal是每个线程私有的,线程可以把自己的私有数据放到ThreadLocal里面,不用担心其他线程访问到自己ThreadLocal。
通过set()方法将值存入ThreadLocal或者修改值,get()方法取出值,remove()方法移除值。
ThreadLocal原理
ThreadLocal类中有一个内部类ThreadLocalMap,它其实就是一个哈希表,当我们往ThreadLocal里面存数据的时候,会通过当前线程得到ThreadLocalMap,以当前ThreadLocal为key,我们set的值为value,存入到ThreadLocalMap这个哈希表中。
如果我们在当前线程定义了多个ThreadLocal,他会存放到唯一的ThreadLocalMap中。
ThreadLocal内存泄露问题
我们知道往ThreadLocal里存放数据时,会存放到ThreadLocalMap中,key是ThreadLocal,value是我们设置的值。但是存放key的时候,不是直接存放的ThreadLocal对象本身,而是存放ThreadLocal的一个弱引用,而value是存放的强引用。在GC时,弱引用被垃圾回收器检查到就会直接回收,而如果线程一直存活的话,这个value也就一直还存在。
避免方法就是在使用完了ThreadLocal之后,一定要用remove方法移除值。