爲何ThreadLocal變量只能用於線程私有

對ThreadLocal的使用,一般是經過其set/get方法開始的。this

set方法的源碼以下:線程

public void set(T value) {
    Thread t = Thread.currentThread(); //獲取當前線程對象
    ThreadLocalMap map = getMap(t);    //從當前線程對象中拿到該線程的ThreadLocalMap對象
    if (map != null)
        map.set(this, value);  //將該ThreadLocal對象做爲key,value做爲值放入ThreadLocalMap中
    else
        createMap(t, value);
}

get方法的源碼以下:對象

public T get() {
    Thread t = Thread.currentThread(); //獲取當前線程對象
    ThreadLocalMap map = getMap(t);    //獲取當前線程的ThreadLocalMap對象
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);  //從ThreadLocalMap中以該ThreadLocal對象爲key獲取其value值
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            return result;
        }
    }
    return setInitialValue();
}

經過上述代碼可知,ThreadLocal在set值時,是先獲取當前操做該ThreadLocal變量的線程對象,而後將該ThreadLocal對象和值以鍵值對的形式存入當前線程對象的ThreadLocalMap中,這樣,每一個線程執行這些代碼時都會根據本身的狀況爲該變量賦不一樣的值並存於當前線程對象內。get

在get值時,也是先獲取當前操做線程對象,而後從當前線程對象的ThreadLocalMap中獲取該ThreadLocal對象對應的值。源碼

所以經過ThreadLocal設置的變量,在每一個線程內都有本身的一個副本,所以就是線程私有的。it

相關文章
相關標籤/搜索