1. 程式人生 > >從底層理解threadlocal為什麼可以每個執行緒一個副本

從底層理解threadlocal為什麼可以每個執行緒一個副本

1.首先如果讓我們設計這種結構,我們怎麼設計?

因為threadlocal從功能上看是每個執行緒都有獨立的副本,互不影響,在自己各自的棧中。如果我們設計的話,肯定想到是跟每個執行緒有關係。然後每個執行緒又關聯一個具體的值,這樣很容易讓我們想到hashmap這種資料結構。以thread為key,以我們要的值,為value。在多執行緒中,我們可能想到執行緒安全的hashmap,concurrenthashmap這種。然而threadlocal並不是這種設計的,但是與這思想很類似。

2.我們看一下threadlocal的get和set方法

  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();
    }
    private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
        return value;
    }
  public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }
為什麼通過t獲取map哪?而不是直接用map哪?首先這個map具體變數entry繼承了WeakReference能幫助儘快釋放記憶體。另外是因為我們看到根據t獲取map。 以上只是本人自己的理解,如果錯誤,敬請諒解。