java多執行緒解說【拾玖】_ThreadLocal總結
阿新 • • 發佈:2018-12-25
突然發現之前總結的知識沒有覆蓋到ThreadLocal,這裡續上一文是為補充。
首先說說什麼是ThreadLocal。看名字感覺像是本地執行緒之意,其實不然。ThreadLocal其實是Thread的一個本地化物件,相當於執行緒訪問其持有物件的代理,各個執行緒可通過它建立並訪問各自的自有物件。說白了就是,執行緒可以建立自己的ThreadLocal儲存想要儲存的物件,實現跨越介面拿到儲存的物件。
觀其實現,其實是Thread內部維護了一個屬性ThreadLocalMap,ThreadLocal本身相當於這個Map的key,使用者輸入的值就是value。每次通過ThreadLocal呼叫get()介面時,是先獲取當前Thread物件,然後處理返回其ThreadLocalMap。set()介面亦然。
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); } public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) return (T)e.value; } return setInitialValue(); }
ThreadLocal的應用場景:
1.需要費執行緒安全的物件,又不想使用鎖;
2.使用執行緒安全物件,又想避免開銷;
3.方法間引數傳遞;
這裡有一點注意:只有執行緒結束後,其ThreadLocal才會被回收,但是當我們使用執行緒池開發時執行緒是被複用的,所以ThreadLocal的生命週期無法預測。另外,如果ThreadLocal中包裝了集合類或複雜物件,那麼當開發者get出的時候可能不敢刪除而是新增,最後可能導致記憶體洩漏。此問題值得關注。