最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java ThreadLocal?類(lèi)常用方法源碼解析

 更新時(shí)間:2023年07月19日 08:38:44   作者:今夜有點(diǎn)兒涼  
這篇文章主要為大家介紹了java ThreadLocal類(lèi)常用方法源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

以下是 ThreadLocal 類(lèi)常用方法源碼解析:

1. get()

獲取當(dāng)前線程的 ThreadLocal 變量的值。如果變量尚未被當(dāng)前線程設(shè)置,則返回 null。

public T get() {
    Thread t = Thread.currentThread();
    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();
}

解釋:該方法首先獲取當(dāng)前線程 Thread.currentThread()。

然后,調(diào)用 getMap(t) 方法獲取當(dāng)前線程的 ThreadLocalMap 對(duì)象 map。

如果 map 不為 null,表示當(dāng)前線程已經(jīng)有一個(gè) ThreadLocalMap,可以嘗試獲取與當(dāng)前 ThreadLocal 對(duì)象關(guān)聯(lián)的值。

調(diào)用 map.getEntry(this) 方法,傳入當(dāng)前 ThreadLocal 對(duì)象作為參數(shù),獲取與之關(guān)聯(lián)的 Entry 節(jié)點(diǎn) e。

如果 e 不為 null,表示找到了與當(dāng)前 ThreadLocal 對(duì)象關(guān)聯(lián)的值。通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換將 e.value 轉(zhuǎn)換為泛型類(lèi)型 T,并將其賦值給 result 變量。

最后,返回 result,即當(dāng)前線程中與當(dāng)前 ThreadLocal 對(duì)象關(guān)聯(lián)的值。

如果 map 為 null 或者未找到與當(dāng)前 ThreadLocal 對(duì)象關(guān)聯(lián)的值,則調(diào)用 setInitialValue() 方法來(lái)設(shè)置初始值,并返回該值。

總之,get() 方法用于獲取當(dāng)前線程中與當(dāng)前 ThreadLocal 對(duì)象關(guān)聯(lián)的值。它首先獲取當(dāng)前線程的 ThreadLocalMap 對(duì)象,然后在該對(duì)象中查找與當(dāng)前 ThreadLocal 對(duì)象關(guān)聯(lián)的值。如果找到了值,則返回該值;否則,設(shè)置初始值并返回。

2. set(T value)

該方法用于將指定的值 value 關(guān)聯(lián)到當(dāng)前線程中的當(dāng)前 ThreadLocal 對(duì)象。

public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}

解釋:該方法首先獲取當(dāng)前線程 Thread.currentThread()。

然后,調(diào)用 getMap(t) 方法獲取當(dāng)前線程的 ThreadLocalMap 對(duì)象 map。

如果 map 不為 null,表示當(dāng)前線程已經(jīng)有一個(gè) ThreadLocalMap,可以直接調(diào)用 map.set(this, value) 方法將當(dāng)前 ThreadLocal 對(duì)象和指定的值 value 關(guān)聯(lián)起來(lái)。

如果 map 為 null,表示當(dāng)前線程還沒(méi)有 ThreadLocalMap,需要調(diào)用 createMap(t, value) 方法來(lái)創(chuàng)建一個(gè)新的 ThreadLocalMap 并將其與當(dāng)前線程關(guān)聯(lián)起來(lái)。

總之,set(T value) 方法用于將指定的值關(guān)聯(lián)到當(dāng)前線程中的當(dāng)前 ThreadLocal 對(duì)象。它首先獲取當(dāng)前線程的 ThreadLocalMap 對(duì)象,然后根據(jù)是否存在該對(duì)象來(lái)選擇直接設(shè)置值或創(chuàng)建新的 ThreadLocalMap 對(duì)象。

3. remove()

該方法用于從當(dāng)前線程的 ThreadLocalMap 中移除與當(dāng)前 ThreadLocal 對(duì)象關(guān)聯(lián)的值。

public void remove() {
    ThreadLocalMap m = getMap(Thread.currentThread());
    if (m != null)
        m.remove(this);
}

解釋:該方法首先通過(guò)調(diào)用 getMap(Thread.currentThread()) 方法獲取當(dāng)前線程的 ThreadLocalMap 對(duì)象 m。

如果 m 不為 null,表示當(dāng)前線程有一個(gè) ThreadLocalMap 對(duì)象,可以調(diào)用 m.remove(this) 方法來(lái)移除與當(dāng)前 ThreadLocal 對(duì)象關(guān)聯(lián)的值。

如果 m 為 null,表示當(dāng)前線程沒(méi)有 ThreadLocalMap 對(duì)象,無(wú)需進(jìn)行任何操作。

總之,remove() 方法用于從當(dāng)前線程的 ThreadLocalMap 中移除與當(dāng)前 ThreadLocal 對(duì)象關(guān)聯(lián)的值。它首先獲取當(dāng)前線程的 ThreadLocalMap 對(duì)象,然后根據(jù)是否存在該對(duì)象來(lái)選擇是否進(jìn)行移除操作。

4. initialValue()

該方法用于提供一個(gè)初始值,以便在首次訪問(wèn) ThreadLocal 對(duì)象時(shí)使用。

protected T initialValue() {
    return supplier.get();
}

解釋:該方法調(diào)用了一個(gè) supplier.get() 方法來(lái)獲取初始值。這里的 supplier 是一個(gè) Supplier<T> 類(lèi)型的對(duì)象,它提供了一個(gè)無(wú)參數(shù)的 get() 方法,用于獲取初始值。

通過(guò)重寫(xiě) initialValue() 方法,我們可以自定義初始值的生成邏輯。默認(rèn)情況下,如果沒(méi)有手動(dòng)設(shè)置初始值,ThreadLocal 的初始值為 null

總之,initialValue() 方法用于提供一個(gè)初始值,在首次訪問(wèn) ThreadLocal 對(duì)象時(shí)使用。通過(guò)重寫(xiě)該方法,我們可以自定義初始值的生成邏輯。

5. withInitial(Supplier<? extends T> supplier)

該方法用于創(chuàng)建一個(gè)具有初始值供應(yīng)者的 ThreadLocal 對(duì)象。

public static &amp;lt;S&amp;gt; ThreadLocal&amp;lt;S&amp;gt; withInitial(Supplier&amp;lt;? extends S&amp;gt; supplier) {
    return new SuppliedThreadLocal&amp;lt;&amp;gt;(supplier);
}

解釋:該方法使用提供的 Supplier 對(duì)象來(lái)創(chuàng)建一個(gè) SuppliedThreadLocal 對(duì)象,該對(duì)象實(shí)現(xiàn)了 ThreadLocal 接口。Supplier 是一個(gè)函數(shù)式接口,它定義了一個(gè)無(wú)參數(shù)的 get() 方法,用于獲取初始值。

通過(guò)調(diào)用 withInitial(supplier) 方法,我們可以創(chuàng)建一個(gè)具有初始值供應(yīng)者的 ThreadLocal 對(duì)象。該供應(yīng)者將在首次訪問(wèn) ThreadLocal 對(duì)象時(shí)生成初始值。

總之,withInitial(Supplier<? extends S> supplier) 方法用于創(chuàng)建一個(gè)具有初始值供應(yīng)者的 ThreadLocal 對(duì)象。通過(guò)該方法,我們可以方便地指定一個(gè)供應(yīng)者來(lái)生成初始值。

6. getMap(Thread t) 

該方法用于獲取給定線程 t 對(duì)應(yīng)的 ThreadLocalMap 對(duì)象。

ThreadLocalMap getMap(Thread t) {
    return t.threadLocals;
}

解釋:在 ThreadLocal 類(lèi)中,每個(gè)線程都有一個(gè)名為 threadLocals 的字段,它是一個(gè) ThreadLocalMap 對(duì)象。該字段用于存儲(chǔ)線程本地變量的鍵值對(duì)。

在 getMap(Thread t) 方法中,通過(guò)訪問(wèn)線程 t 的 threadLocals 字段,直接返回對(duì)應(yīng)的 ThreadLocalMap 對(duì)象。

這個(gè)方法的作用是為了獲取特定線程的 ThreadLocalMap 對(duì)象,以便進(jìn)行后續(xù)的操作,比如獲取或設(shè)置線程本地變量的值。

需要注意的是,getMap(Thread t) 方法是 ThreadLocal 類(lèi)的內(nèi)部方法,我們通常不需要直接調(diào)用它,而是通過(guò) ThreadLocal 對(duì)象的方法間接地訪問(wèn)線程本地變量。

以上是 ThreadLocal 類(lèi)常用方法的源碼和詳細(xì)解釋。這些方法允許您在多線程環(huán)境中維護(hù)線程本地變量,并提供了獲取、設(shè)置、移除 ThreadLocal 變量的功能,更多關(guān)于ThreadLocal 類(lèi)常用方法源碼解析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中Dijkstra算法求解最短路徑的實(shí)現(xiàn)

    Java中Dijkstra算法求解最短路徑的實(shí)現(xiàn)

    Dijkstra算法是一種解決最短路徑問(wèn)題的常用算法,本文主要介紹了Java中Dijkstra算法求解最短路徑的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • Spring如何實(shí)現(xiàn)輸出帶動(dòng)態(tài)標(biāo)簽的日志

    Spring如何實(shí)現(xiàn)輸出帶動(dòng)態(tài)標(biāo)簽的日志

    文章介紹了如何通過(guò)動(dòng)態(tài)標(biāo)簽日志實(shí)現(xiàn),解決了部分業(yè)務(wù)代碼在多個(gè)模塊中調(diào)用時(shí)日志無(wú)法直觀看出來(lái)源的問(wèn)題,主要通過(guò)ThreadLocal存儲(chǔ)業(yè)務(wù)標(biāo)簽,并在日志輸出時(shí)插入該標(biāo)簽,實(shí)現(xiàn)日志的動(dòng)態(tài)標(biāo)簽功能,感興趣的朋友一起看看吧
    2024-12-12
  • java JSP開(kāi)發(fā)之Spring中Bean的使用

    java JSP開(kāi)發(fā)之Spring中Bean的使用

    這篇文章主要介紹了java JSP開(kāi)發(fā)之Spring中Bean的使用的相關(guān)資料,在Spring中,bean的生命周期就比較復(fù)雜,這里就詳細(xì)介紹下,需要的朋友可以參考下
    2017-08-08
  • Java如何處理延遲任務(wù)過(guò)程解析

    Java如何處理延遲任務(wù)過(guò)程解析

    這篇文章主要介紹了Java如何處理延遲任務(wù)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • C++ 歸并排序(merge sort)案例詳解

    C++ 歸并排序(merge sort)案例詳解

    這篇文章主要介紹了C++ 歸并排序(merge sort)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SpringBoot中?Jackson?日期的時(shí)區(qū)和日期格式問(wèn)題解決

    SpringBoot中?Jackson?日期的時(shí)區(qū)和日期格式問(wèn)題解決

    因?yàn)樽罱?xiàng)目需要國(guó)際化,需要能夠支持多種國(guó)際化語(yǔ)言,目前需要支持三種(法語(yǔ)、英語(yǔ)、簡(jiǎn)體中文),這篇文章主要介紹了SpringBoot中?Jackson?日期的時(shí)區(qū)和日期格式問(wèn)題,需要的朋友可以參考下
    2022-12-12
  • 2022?最新?IntelliJ?IDEA?詳細(xì)配置步驟演示(推薦)

    2022?最新?IntelliJ?IDEA?詳細(xì)配置步驟演示(推薦)

    作為一名開(kāi)發(fā)人員,第一肯定是選擇一款趁手的開(kāi)發(fā)利器,本人使用?Java?偏多,這里推薦使用?IntelliJ?IDEA,?俗稱神級(jí)開(kāi)發(fā)工具,具體的安裝過(guò)程就不過(guò)多贅述了,有需要了解的朋友可以參考下本文
    2022-09-09
  • SpringCloud集成Hystrix熔斷過(guò)程分步分解

    SpringCloud集成Hystrix熔斷過(guò)程分步分解

    通過(guò)hystrix可以解決雪崩效應(yīng)問(wèn)題,它提供了資源隔離、降級(jí)機(jī)制、融斷、緩存等功能。接下來(lái)通過(guò)本文給大家分享SpringCloud集成Hystrix熔斷,感興趣的朋友一起看看吧
    2022-09-09
  • 淺談cookie 和session 的區(qū)別

    淺談cookie 和session 的區(qū)別

    下面小編就為大家?guī)?lái)一篇淺談cookie 和session 的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • Java 關(guān)鍵字static詳解及實(shí)例代碼

    Java 關(guān)鍵字static詳解及實(shí)例代碼

    這篇文章主要介紹了Java 關(guān)鍵字static詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04

最新評(píng)論

清水县| 嘉定区| 太仆寺旗| 房产| 冷水江市| 应城市| 奉新县| 霍州市| 铁岭市| 金山区| 丹寨县| 若羌县| 河津市| 句容市| 明星| 东光县| 门头沟区| 东安县| 扬中市| 卫辉市| 茌平县| 大石桥市| 安徽省| 胶州市| 洞头县| 于田县| 临清市| 和静县| 广德县| 永仁县| 紫金县| 庆阳市| 诸城市| 东乡| 木里| 安国市| 屯留县| 巴中市| 易门县| 武穴市| 杭锦旗|