ThreadLocal理解 – JAVA編程語言程序開發技術文章

ThreadLocal 中有一個內部類 ThreadLocalMap ,ThreadLocalMap 是一個Hash結構,而它的健值對是 ThreadLocal/value
我們執行ThreadLocal中的get 方法時,可以得到當前線程中的對象,那麼它是怎麼得到呢?
這樣我們得先來看一下 Thread 類的東東,打開Thread  類,看見它有這樣一個屬性:ThreadLocal.ThreadLocalMap threadLocals = null;
每個線程中都有ThreadLocalMap,當我們執行ThreadLocal對象中的 get() 方法時、它會先得到當前的線程,然後取出當前線程中的ThreadLocalMap 對象,而這個ThreadLocalMap 是一個映射,它的Key 是以ThreadLocal對象為
Key,value則是我們希望當前線程保存的值,既然操作的都是ThreadLocalMap,那麼ThreadLocal對象起到一個什麼作用呢?
我們所希望的是ThreadLocal對象執行get()方法返回的是當前線程中保存的的值,好多線程共同操作它,它是怎麼區分線程之間的,這個很簡單,因為ThreadLocal操作的都是
Thread 對象中的ThreadLocalMap 對象,這樣每個線程的值當前不一樣,更不會互相影響,其實到這裡已經可以做到線程之間的互不影響,而這個MAP的類型為什麼要是<ThreadLoca,Object>
的形式,而不直接是一個Object,雖然直接是一個Object也能完成線程之間的共享,但如果有多個ThreadLocal對象,那麼ThreadLocalMap中的Object 到底要保存哪個ThreadLocal對象中的
值,這就必須要使 Thread 中的 的引用是一個集合,要想使某個ThreadLocal 對象快速定位到它在ThreadLocalMap 中對應的值,就註定要使用Map,而這個Map則是以ThreadLocal為鍵值
在我們執行ThreadLocal.get()當前線程值的意思就是:
在當前線程中的ThreadLocalMap中給我取出 這個ThreadLocal對象對應的值,
因此在使用的時候,我們可以定義一個公共的ThreadLocal來保存線程之間的值,因為ThreadLocal隻是Thread中的Map 的一個映射,取值則是從當前Thread中Map取出來的
和ThreadLocal對象沒有啥關系的
public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
//返回當前線程中的ThreadLocalMap
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null)
                return (T)e.value;
        }
        return setInitialValue();
    }

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。