threadlocal是把ThreadLocal實例做爲key,要保持的對象做爲值,設置到當前線程的ThreadLocalMap 中。所以數據是保存在當前線程中的。java
ThreadLocalMap實例是做爲java.lang.Thread的成員變量存儲的,每一個線程有惟一的一個threadLocalMap。這個map以ThreadLocal對象爲key,」線程局部變量」爲值,因此一個線程下能夠保存多個」線程局部變量」。對ThreadLocal的操做,實際委託給當前Thread,每一個Thread都會有本身獨立的ThreadLocalMap實例,存儲的倉庫是Entry[] table;Entry的key爲ThreadLocal,value爲存儲內容;所以在併發環境下,對ThreadLocal的set或get,不會有任何問題。併發
總之,ThreadLocal不是用來解決對象共享訪問問題的,而主要是提供了保持對象的方法和避免參數傳遞的方便的對象訪問方式。概括了兩點:spa
每一個線程中都有一個本身的ThreadLocalMap類對象,能夠將線程本身的對象保持到其中,各管各的,線程能夠正確的訪問到本身的對象。線程
將一個共用的ThreadLocal靜態實例做爲key,將不一樣對象的引用保存到不一樣線程的ThreadLocalMap中,而後在線程執行的各處經過這個靜態ThreadLocal實例的get()方法取得本身線程保存的那個對象,避免了將這個對象做爲參數傳遞的麻煩。orm
ThreadLocal應定義爲靜態成員變量。對象
能經過傳值傳遞的參數,不要經過ThreadLocal存儲,以避免形成ThreadLocal的濫用。內存
在線程池的狀況下,在ThreadLocal業務週期處理完成時,最好顯式的調用remove()方法,清空」線程局部變量」中的值。rem
正常狀況下使用ThreadLocal不會形成內存溢出,弱引用的只是threadLocal,保存的值依然是強引用的,若是threadLocal依然被其餘對象強引用,」線程局部變量」是沒法回收的。get