什么是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方法移除值。