1. 程式人生 > >java多執行緒解說【拾玖】_ThreadLocal總結

java多執行緒解說【拾玖】_ThreadLocal總結

突然發現之前總結的知識沒有覆蓋到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出的時候可能不敢刪除而是新增,最後可能導致記憶體洩漏。此問題值得關注。