從底層理解threadlocal為什麼可以每個執行緒一個副本
阿新 • • 發佈:2019-02-19
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。 以上只是本人自己的理解,如果錯誤,敬請諒解。