欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)前線(xiàn)程的 ThreadLocal 變量的值。如果變量尚未被當(dāng)前線(xiàn)程設(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();
}

解釋?zhuān)涸摲椒ㄊ紫全@取當(dāng)前線(xiàn)程 Thread.currentThread()

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

如果 map 不為 null,表示當(dāng)前線(xiàn)程已經(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)前線(xiàn)程中與當(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)前線(xiàn)程中與當(dāng)前 ThreadLocal 對(duì)象關(guān)聯(lián)的值。它首先獲取當(dāng)前線(xiàn)程的 ThreadLocalMap 對(duì)象,然后在該對(duì)象中查找與當(dāng)前 ThreadLocal 對(duì)象關(guān)聯(lián)的值。如果找到了值,則返回該值;否則,設(shè)置初始值并返回。

2. set(T value)

該方法用于將指定的值 value 關(guān)聯(lián)到當(dāng)前線(xiàn)程中的當(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);
}

解釋?zhuān)涸摲椒ㄊ紫全@取當(dāng)前線(xiàn)程 Thread.currentThread()。

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

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

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

3. remove()

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

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

解釋?zhuān)涸摲椒ㄊ紫韧ㄟ^(guò)調(diào)用 getMap(Thread.currentThread()) 方法獲取當(dāng)前線(xiàn)程的 ThreadLocalMap 對(duì)象 m。

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

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

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

4. initialValue()

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

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

解釋?zhuān)涸摲椒ㄕ{(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è)初始值,在首次訪(fǎng)問(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);
}

解釋?zhuān)涸摲椒ㄊ褂锰峁┑?nbsp;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)者將在首次訪(fǎ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) 

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

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

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

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

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

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

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

相關(guān)文章

  • String實(shí)例化及static final修飾符實(shí)現(xiàn)方法解析

    String實(shí)例化及static final修飾符實(shí)現(xiàn)方法解析

    這篇文章主要介紹了String實(shí)例化及static final修飾符實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • SpringMVC中@Valid不起效BindingResult讀取不到Error信息

    SpringMVC中@Valid不起效BindingResult讀取不到Error信息

    在寫(xiě)SpringMVC項(xiàng)目時(shí),由于要對(duì)表單數(shù)據(jù)進(jìn)行校驗(yàn),需要使用@Valid進(jìn)行校驗(yàn),但是在進(jìn)行數(shù)據(jù)校驗(yàn)時(shí),BindingResult對(duì)象無(wú)法攔截非法表單數(shù)據(jù),result.hasErrors()無(wú)論怎么輸入都會(huì)返回false,本文詳細(xì)的介紹一下解決方法
    2021-09-09
  • Spring Boot 集成 RocketMQ 全流程指南(從依賴(lài)引入到消息收發(fā))

    Spring Boot 集成 RocketMQ 全流程指南(從依賴(lài)引入到消息收發(fā)

    本文將通過(guò) 手動(dòng)連接 和 配置連接 兩種方式,詳細(xì)講解如何在 Spring Boot 中集成 RocketMQ,實(shí)現(xiàn)消息的同步與異步發(fā)送,并提供完整示例代碼,感興趣的朋友一起看看吧
    2025-04-04
  • java實(shí)現(xiàn)圖片縮放、旋轉(zhuǎn)和馬賽克化

    java實(shí)現(xiàn)圖片縮放、旋轉(zhuǎn)和馬賽克化

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖片縮放、旋轉(zhuǎn)和馬賽克化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 快速掌握J(rèn)ava8中的Optional

    快速掌握J(rèn)ava8中的Optional

    Optional 是一個(gè)容器類(lèi),代表一個(gè)值存在或不存在,Optional并不是用來(lái)替換所有的null,而是為了在設(shè)計(jì)良好的API中更明確地表達(dá)可能缺失的值,這篇文章主要介紹了Java8的Optional及使用,需要的朋友可以參考下
    2023-07-07
  • SpringBoot2.4.2下使用Redis配置Lettuce的示例

    SpringBoot2.4.2下使用Redis配置Lettuce的示例

    這篇文章主要介紹了SpringBoot2.4.2下使用Redis配置Lettuce,Springboot2.4.2下默認(rèn)使用的就是Lettuce而不是Jedis因此無(wú)需在依賴(lài)進(jìn)行排除Jedis,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2022-01-01
  • Bean的自動(dòng)注入及循環(huán)依賴(lài)問(wèn)題

    Bean的自動(dòng)注入及循環(huán)依賴(lài)問(wèn)題

    本文詳細(xì)介紹了Bean的自動(dòng)注入及循環(huán)依賴(lài),文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)有一定的研究?jī)r(jià)值,感興趣的小伙伴可以閱讀參考
    2023-03-03
  • Java中的@interface注解使用詳解

    Java中的@interface注解使用詳解

    這篇文章主要介紹了Java中的@interface注解使用詳解,注解@interface不是接口是注解類(lèi),在jdk1.5之后加入的功能,使用@interface自定義注解時(shí),自動(dòng)繼承了java.lang.annotation.Annotation接口,需要的朋友可以參考下
    2023-12-12
  • Springboot?手動(dòng)分頁(yè)查詢(xún)分批批量插入數(shù)據(jù)的實(shí)現(xiàn)流程

    Springboot?手動(dòng)分頁(yè)查詢(xún)分批批量插入數(shù)據(jù)的實(shí)現(xiàn)流程

    這篇文章主要介紹了Springboot?手動(dòng)分頁(yè)查詢(xún)分批批量插入數(shù)據(jù)的實(shí)現(xiàn)流程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • 實(shí)戰(zhàn)講解Maven安裝及基本使用詳解

    實(shí)戰(zhàn)講解Maven安裝及基本使用詳解

    這篇文章主要介紹了實(shí)戰(zhàn)講解Maven安裝及基本使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評(píng)論