溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Netty分布式FastThreadLocal的set方法怎么用

發布時間:2022-03-29 17:44:19 來源:億速云 閱讀:148 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“Netty分布式FastThreadLocal的set方法怎么用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Netty分布式FastThreadLocal的set方法怎么用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

FastThreadLocal的set方法實現

set方法, 其實就是修改線程共享對象, 作用域只是當前線程, 我們回顧根據上一小節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操作, 上一小節已經進行過分析, 這里不再贅述, 同時, 參數也傳入了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非常類型, 都是直接通過索引操作的, 這里根據索引值, 直接通過數組下標的方式對元素進行設置, 熟悉上一小節內容的同學對此應該不會陌生

回到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 { }

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

讀到這里,這篇“Netty分布式FastThreadLocal的set方法怎么用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女