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

Netty分布式FastThreadLocal的set方法實現(xiàn)邏輯剖析

 更新時間:2022年03月29日 15:56:32   作者:向南是個萬人迷  
這篇文章主要為大家介紹了Netty分布式FastThreadLocal的set方法實現(xiàn)邏輯剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

上一小節(jié)我們學(xué)習(xí)了FastThreadLocal的創(chuàng)建和get方法的實現(xiàn)邏輯, 這一小節(jié)學(xué)習(xí)FastThreadLocal的set方法的實現(xiàn)邏輯

FastThreadLocal的set方法實現(xiàn)

set方法, 其實就是修改線程共享對象, 作用域只是當(dāng)前線程, 我們回顧根據(jù)上一小節(jié)demo中, 其中一個線程set對象的過程:

線程set對象

new Thread(new Runnable() {
    @Override
    public void run() {
        Object obj  = fastThreadLocalDemo.fastThreadLocalTest.get();
        try {
            for (int i=0;i<10;i++){
                fastThreadLocalDemo.fastThreadLocalTest.set(new Object());
                Thread.sleep(1000);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}).start();

我們跟到set方法中:

public final void set(V value) {
    if (value != InternalThreadLocalMap.UNSET) {
        set(InternalThreadLocalMap.get(), value);
    } else {
        remove();
    }
}

這里首先判斷我們當(dāng)前設(shè)置的對象是不是UNSET, 因為這里不是UNSET, 所以進(jìn)到if塊中

if塊調(diào)用了重載的set方法, 參數(shù)仍然為InternalThreadLocalMap, 有關(guān)InternalThreadLocalMap的get操作, 上一小節(jié)已經(jīng)進(jìn)行過分析, 這里不再贅述, 同時, 參數(shù)也傳入了set的value值

我們跟到重載的set方法中:

public final void set(InternalThreadLocalMap threadLocalMap, V value) {
    if (value != InternalThreadLocalMap.UNSET) {
        if (threadLocalMap.setIndexedVariable(index, value)) {
            addToVariablesToRemove(threadLocalMap, this);
        }
    } else {
        remove(threadLocalMap);
    }
}

這里我們重點關(guān)注 if (threadLocalMap.setIndexedVariable(index, value)) 這部分, 這里通過threadLocalMap調(diào)用setIndexedVariable方法進(jìn)行對象的設(shè)置, 傳入了當(dāng)前FastThreadLocal的下標(biāo)和value

我們跟到setIndexedVariable中

public boolean setIndexedVariable(int index, Object value) {
    Object[] lookup = indexedVariables;
    if (index < lookup.length) {
        Object oldValue = lookup[index];
        lookup[index] = value;
        return oldValue == UNSET;
    } else {
        expandIndexedVariableTableAndSet(index, value);
        return true;
    }
}

這里的邏輯其實和get非常類型, 都是直接通過索引操作的, 這里根據(jù)索引值, 直接通過數(shù)組下標(biāo)的方式對元素進(jìn)行設(shè)置, 熟悉上一小節(jié)內(nèi)容的同學(xué)對此應(yīng)該不會陌生

回到FastThreadLocal的Set方法中:

public final void set(V value) {
    if (value != InternalThreadLocalMap.UNSET) {
        set(InternalThreadLocalMap.get(), value);
    } else {
        remove();
    }
}

剛才我們分析了如果修改的對象不是UNSET對象的操作, 如果修改的對象是UNSET對象, 則會調(diào)用remove方法

跟進(jìn)remove方法:

public final void remove(InternalThreadLocalMap threadLocalMap) {
    if (threadLocalMap == null) {
        return;
    }
    Object v = threadLocalMap.removeIndexedVariable(index);
    removeFromVariablesToRemove(threadLocalMap, this);
    if (v != InternalThreadLocalMap.UNSET) {
        try {
            onRemoval((V) v);
        } catch (Exception e) {
            PlatformDependent.throwException(e);
        }
    }
}

 Object v = threadLocalMap.removeIndexedVariable(index) 

這一步是根據(jù)索引index, 將值設(shè)置成UNSET

我們跟進(jìn)removeIndexedVariable方法

public Object removeIndexedVariable(int index) {
    Object[] lookup = indexedVariables;
    if (index < lookup.length) {
        Object v = lookup[index];
        lookup[index] = UNSET;
        return v;
    } else {
        return UNSET;
    }
}

這里的邏輯也比較簡單, 根據(jù)index通過數(shù)組下標(biāo)的方式將元素設(shè)置成UNSET對象

回到remove方法中:

 if (v != InternalThreadLocalMap.UNSET) 

這里判斷如果我們設(shè)置的值不是UNSET對象, 則會調(diào)用onRemoval方法

跟進(jìn)onRemoval方法:

protected void onRemoval(@SuppressWarnings("UnusedParameters") V value) throws Exception { }

這里是個空實現(xiàn), 用于交給子類去完成

以上就是FastThreadLocal的set方法的實現(xiàn),更多關(guān)于Netty分布式FastThreadLocal的set方法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JAVA把結(jié)果保留兩位小數(shù)的3種方法舉例

    JAVA把結(jié)果保留兩位小數(shù)的3種方法舉例

    在寫程序的時候,有時候可能需要設(shè)置小數(shù)的位數(shù),所以下面這篇文章主要給大家介紹了關(guān)于JAVA把結(jié)果保留兩位小數(shù)的3種方法,文章通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Java責(zé)任鏈模式模板代碼分享

    Java責(zé)任鏈模式模板代碼分享

    這篇文章主要介紹了Java責(zé)任鏈模式模板代碼分享,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • java實現(xiàn)紙牌游戲之小貓釣魚算法

    java實現(xiàn)紙牌游戲之小貓釣魚算法

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)紙牌游戲之小貓釣魚算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • IDEA中使用Git的圖文教程

    IDEA中使用Git的圖文教程

    本文主要介紹了IDEA中使用Git的圖文教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 深入理解DevOps+微服務(wù)框架

    深入理解DevOps+微服務(wù)框架

    這篇文章主要介紹了深入理解DevOps+微服務(wù),主要包括DevOps 的三大支柱之中,即人(People)、流程(Process)和平臺(Platform)的知識講解,需要的朋友可以參考下
    2022-05-05
  • springsecurity實現(xiàn)登錄驗證以及根據(jù)用戶身份跳轉(zhuǎn)不同頁面

    springsecurity實現(xiàn)登錄驗證以及根據(jù)用戶身份跳轉(zhuǎn)不同頁面

    Spring?Security是一種基于Spring框架的安全技術(shù),用于實現(xiàn)身份驗證和訪問控制,本文介紹了如何使用Spring?Security,結(jié)合session和redis來存儲用戶信息,并通過編寫特定的登錄處理類和Web配置,實現(xiàn)用戶登錄和注銷功能
    2024-09-09
  • Mapper層繼承BaseMapper<T>需要引入的pom依賴方式

    Mapper層繼承BaseMapper<T>需要引入的pom依賴方式

    這篇文章主要介紹了Mapper層繼承BaseMapper<T>需要引入的pom依賴方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • maven子模塊相互依賴打包時報錯找不到類的解決方案

    maven子模塊相互依賴打包時報錯找不到類的解決方案

    本文主要介紹了maven子模塊相互依賴打包時報錯找不到類的解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java foreach相關(guān)原理及用法解析

    Java foreach相關(guān)原理及用法解析

    這篇文章主要介紹了Java foreach相關(guān)原理及用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • RestTemplate自定義ErrorHandler方式

    RestTemplate自定義ErrorHandler方式

    這篇文章主要介紹了RestTemplate自定義ErrorHandler方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評論

嘉义市| 西林县| 牟定县| 蕲春县| 弥渡县| 东阳市| 中山市| 凯里市| 岳普湖县| 临邑县| 泌阳县| 尖扎县| 凤山市| 宜丰县| 龙里县| 德格县| 奉节县| 越西县| 辰溪县| 通城县| 济宁市| 东莞市| 泉州市| 阿拉善左旗| 集贤县| 沙河市| 江孜县| 鹤壁市| 泰来县| 谢通门县| 年辖:市辖区| 庆元县| 阳东县| 阿合奇县| 休宁县| 手游| 铜川市| 右玉县| 英德市| 镇康县| 黄浦区|