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

Netty分布式FastThreadLocal的set方法實現邏輯剖析

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

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

FastThreadLocal的set方法實現

set方法, 其實就是修改線程共享對象, 作用域只是當前線程, 我們回顧根據上一小節(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();
    }
}

這里首先判斷我們當前設置的對象是不是UNSET, 因為這里不是UNSET, 所以進到if塊中

if塊調用了重載的set方法, 參數仍然為InternalThreadLocalMap, 有關InternalThreadLocalMap的get操作, 上一小節(jié)已經進行過分析, 這里不再贅述, 同時, 參數也傳入了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);
    }
}

這里我們重點關注 if (threadLocalMap.setIndexedVariable(index, value)) 這部分, 這里通過threadLocalMap調用setIndexedVariable方法進行對象的設置, 傳入了當前FastThreadLocal的下標和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非常類型, 都是直接通過索引操作的, 這里根據索引值, 直接通過數組下標的方式對元素進行設置, 熟悉上一小節(jié)內容的同學對此應該不會陌生

回到FastThreadLocal的Set方法中:

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

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

跟進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) 

這一步是根據索引index, 將值設置成UNSET

我們跟進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;
    }
}

這里的邏輯也比較簡單, 根據index通過數組下標的方式將元素設置成UNSET對象

回到remove方法中:

 if (v != InternalThreadLocalMap.UNSET) 

這里判斷如果我們設置的值不是UNSET對象, 則會調用onRemoval方法

跟進onRemoval方法:

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

這里是個空實現, 用于交給子類去完成

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

相關文章

  • JDK動態(tài)代理原理:只能代理接口,不能代理類問題

    JDK動態(tài)代理原理:只能代理接口,不能代理類問題

    這篇文章主要介紹了JDK動態(tài)代理原理:只能代理接口,不能代理類問題。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • java抓取網頁數據示例

    java抓取網頁數據示例

    要通java獲取整個網頁的html內容,或者某個網絡文件的內容,可以使用java提供的HttpURLConnection類來實現對網頁內容的抓取
    2014-03-03
  • springboot加載一個properties文件轉換為map方式

    springboot加載一個properties文件轉換為map方式

    這篇文章主要介紹了springboot加載一個properties文件轉換為map方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Spring Boot之FilterRegistrationBean-自定義Filter詳解

    Spring Boot之FilterRegistrationBean-自定義Filter詳解

    這篇文章主要介紹了Spring Boot之FilterRegistrationBean-自定義Filter詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java拷貝數組方法Arrays.copyOf()是地址傳遞的證明實例

    Java拷貝數組方法Arrays.copyOf()是地址傳遞的證明實例

    今天小編就為大家分享一篇關于Java拷貝數組方法Arrays.copyOf()是地址傳遞的證明實例,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Java中static靜態(tài)變量的初始化完全解析

    Java中static靜態(tài)變量的初始化完全解析

    static所聲明的變量在Java中有一個初始化的先后順序,帶著這個問題接下來我們就來進行Java中static靜態(tài)變量的初始化完全解析:
    2016-06-06
  • mybatis?一對多映射?column屬性的注意事項說明

    mybatis?一對多映射?column屬性的注意事項說明

    這篇文章主要介紹了mybatis?一對多映射?column屬性的注意事項說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Java 類在 Tomcat 中是如何加載的(過程分析)

    Java 類在 Tomcat 中是如何加載的(過程分析)

    這篇文章主要介紹了Java 類在 Tomcat 中是如何加載的過程分析,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • IDEA搭建Maven模塊化項目的實現

    IDEA搭建Maven模塊化項目的實現

    本文主要介紹了IDEA搭建Maven模塊化項目的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • Spring AOP訪問目標方法的參數操作示例

    Spring AOP訪問目標方法的參數操作示例

    這篇文章主要介紹了Spring AOP訪問目標方法的參數操作,結合實例形式詳細分析了spring面向切面AOP訪問目標方法的參數相關實現步驟與操作注意事項,需要的朋友可以參考下
    2020-01-01

最新評論