Java ThreadLocal

前言

ThreadLcoal提供了一種實現(xiàn)去讓線程創(chuàng)建內(nèi)部變量,而與其他線程隔離開來,這也是保證線程安全的方法之一。
想要實現(xiàn)這種功能,我們很自然會想到讓ThreadLocal去維護一個HashMap,其中key是Thread對象,value是變量值。

但是ThreadLocal并沒有這樣做,而是每個線程維護一個ThreadLcoalMap,key是ThreadLocal對象,value是變量值。這樣做的好處又是什么呢?

源碼分析

set(T value)

public void set(T value) {
        //先獲取當前線程
        Thread t = Thread.currentThread();
        //獲取線程內(nèi)部維護的一個哈希表
        ThreadLocal.ThreadLocalMap map = getMap(t);
        if (map != null)
            //如果存在,賦值
            map.set(this, value);
        else
            //不存在,先創(chuàng)建再賦值
            createMap(t, value);
    }

get()

public T get() {
        //獲取當前線程
        Thread t = Thread.currentThread();
        //獲取線程內(nèi)部維護的一個哈希表
        ThreadLocal.ThreadLocalMap map = getMap(t);
        if (map != null) {
            //從哈希表獲取當前線程的內(nèi)部變量,這里的this是ThreadLocal對象
            ThreadLocal.ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        //設(shè)置初始化值,默認為null,可以重寫setInitialValue()方法
        return setInitialValue();
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容