大白話講解ThreadLocal的原理
阿新 • • 發佈:2018-11-10
ThreadLocal顧名思義,本地執行緒,可以理解為本地執行緒變數,說白了就是操作本地執行緒的區域性變數。
下面我們通過原始碼進行說明:
首先,我們看一下ThreadLocal的set方法原始碼實現:
通過原始碼我們可以發現,首先獲取了當前執行緒,然後呼叫getMap方法,將當前執行緒傳了進去,返回了ThreadLocalMap。我們先來看一下getMappublic void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
方法。
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
嗯??返回了當前執行緒的threadLocals,所以我們知道了,原來ThreadLocalMap是當前執行緒的一個變數的型別,所以這個threadLocals是執行緒自己
本身就有的東西,屬於Thread。
然後再看set方法,當map不為空,將this即ThreadLocal當key,這裡也許有同學不理解了,為什麼要將ThreadLocal當key呢?
因為我們不一定就一個ThreadLocal,有可能有多個,而threadLocals是執行緒自己本身的,如果有多個ThreadLocal,也就是有
多個值需要儲存到threadLocals中,我們就可以通過ThreadLocal來取出不同的資訊。
還是有點迷糊??
其實說白了就是,每一個Thread執行緒都擁有自己的一個型別為ThreadLocalMap,名稱為threadLocals的區域性變數,就像名字表達的這樣,這個變數可以
以ThreadLocal為key進行儲存自己的資訊。而ThreadLocal其實就是為了使我們操作threadLocals變數更加方便,而封裝的一個類。使用ThreadLocal和
我們直接自己定義執行緒的區域性變數都一樣,只是使用ThreadLocal使我們的程式碼更加優雅,簡潔。我們不用關注執行緒,只需要操作ThreadLocal就可以取得
該執行緒自己的變數
上面是我根據自己的理解畫的圖,如果不對,請及時指正。