1. 程式人生 > >大白話講解ThreadLocal的原理

大白話講解ThreadLocal的原理

ThreadLocal顧名思義,本地執行緒,可以理解為本地執行緒變數,說白了就是操作本地執行緒的區域性變數。

下面我們通過原始碼進行說明:

首先,我們看一下ThreadLocal的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);
    }
通過原始碼我們可以發現,首先獲取了當前執行緒,然後呼叫getMap方法,將當前執行緒傳了進去,返回了ThreadLocalMap。我們先來看一下getMap

方法。

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就可以取得

該執行緒自己的變數


   上面是我根據自己的理解畫的圖,如果不對,請及時指正。