【多線程和併發】ThreadLocal

ThreadLocal相當於一個容器,用於存放每個線程的局部變量。ThreadLocal實例通常來說都是private static類型的。ThreadLocal可以給一個初始值,而每個線程都會獲得這個初始化值的一個副本,這樣才能保證不同的線程都有一份拷貝。

一般情況下,通過ThreadLocal.set()到線程中的對象是該線程自己使用的對象,其他線程是訪問不到的,各個線程中訪問的是不同的對象。如果ThreadLocal.set()對象的set(Object o)時,該方法則通過Thread.currentThread()獲取當前線程,將變量存入線程中的ThreadLocalMap類的對象內,Map中元素的鍵爲當前的ThreadLocal對象,而值對應線程的變量副本。

public T get() {
        //每個Thread對象內都保存一個ThreadLocalMap對象
        Thread t = Thread.currentThread();
        //map中元素的鍵爲共用的ThreadLocal對象,而值爲對應線程的變量副本。
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
}

public 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;
}

void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章