深入研究JDK併發集合類-ThreadLocal實現原理

具體如何使用,本章不關注。請自行百度。

關注核心方法 get() 和 set()

public class ThreadLocal<T> {

    //

    public void set(T value) {

        Thread t = Thread.currentThread();

        ThreadLocalMap map = t.threadLocals;

        if (map != null) {

            map.set(this, value);

        } else {

            t.threadLocals = new ThreadLocalMap(this, firstValue);//key爲當前的ThreadLocal變量,value爲要放入的值

        }

    }

原文:https://blog.csdn.net/lan861698789/article/details/81323757

    //

    public T get() {

        Thread t = Thread.currentThread();

        ThreadLocalMap map = t.threadLocals;

        if (map != null) {

            ThreadLocalMap.Entry e = map.getEntry(this);

            if (e != null) {

                return (T)e.value;

            }

        }

        return setInitialValue();//初始化爲null

    }

}

分析:

1).實際的通過ThreadLocal創建的副本是存儲在每個線程Thread自己的threadLocals中的;

在每個線程Thread內部有一個成員變量threadLocals,這個threadLocals就是用來存儲實際的變量副本的,鍵值爲當前ThreadLocal變量,value爲變量副本(即T類型的變量)。

2).爲何threadLocals的類型ThreadLocalMap的鍵值爲ThreadLocal對象,因爲每個線程中可有多個threadLocal變量,就像上面代碼中的longLocal和stringLocal;

原文:https://blog.csdn.net/lan861698789/article/details/81323757

重點:

這個threadLocals就是用來存儲實際的變量副本的,鍵值爲當前ThreadLocal變量,value爲變量副本(即T類型的變量)。

原文:https://blog.csdn.net/lan861698789/article/details/81323757

如果沒有ThreadLocal,我們自己怎麼實現呢?

1.需要Thread也爲我們創建一個Map

2.然後Thread.currentThread()得到這個map,然後put一個自定義N個key進去。如keyA。

3.取的時候,同樣拿到當前線程的map,然後get(keyA).

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