Netty分布式FastThreadLocal的set方法實現(xiàn)邏輯剖析
上一小節(jié)我們學習了FastThreadLocal的創(chuàng)建和get方法的實現(xiàn)邏輯, 這一小節(jié)學習FastThreadLocal的set方法的實現(xiàn)邏輯
FastThreadLocal的set方法實現(xiàn)
set方法, 其實就是修改線程共享對象, 作用域只是當前線程, 我們回顧根據(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();
}
}這里首先判斷我們當前設置的對象是不是UNSET, 因為這里不是UNSET, 所以進到if塊中
if塊調(diào)用了重載的set方法, 參數(shù)仍然為InternalThreadLocalMap, 有關InternalThreadLocalMap的get操作, 上一小節(jié)已經(jīng)進行過分析, 這里不再贅述, 同時, 參數(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);
}
}這里我們重點關注 if (threadLocalMap.setIndexedVariable(index, value)) 這部分, 這里通過threadLocalMap調(diào)用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非常類型, 都是直接通過索引操作的, 這里根據(jù)索引值, 直接通過數(shù)組下標的方式對元素進行設置, 熟悉上一小節(jié)內(nèi)容的同學對此應該不會陌生
回到FastThreadLocal的Set方法中:
public final void set(V value) {
if (value != InternalThreadLocalMap.UNSET) {
set(InternalThreadLocalMap.get(), value);
} else {
remove();
}
}剛才我們分析了如果修改的對象不是UNSET對象的操作, 如果修改的對象是UNSET對象, 則會調(diào)用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)
這一步是根據(jù)索引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;
}
}這里的邏輯也比較簡單, 根據(jù)index通過數(shù)組下標的方式將元素設置成UNSET對象
回到remove方法中:
if (v != InternalThreadLocalMap.UNSET)
這里判斷如果我們設置的值不是UNSET對象, 則會調(diào)用onRemoval方法
跟進onRemoval方法:
protected void onRemoval(@SuppressWarnings("UnusedParameters") V value) throws Exception { }這里是個空實現(xiàn), 用于交給子類去完成
以上就是FastThreadLocal的set方法的實現(xiàn),更多關于Netty分布式FastThreadLocal的set方法的資料請關注腳本之家其它相關文章!
相關文章
JAVA把結(jié)果保留兩位小數(shù)的3種方法舉例
在寫程序的時候,有時候可能需要設置小數(shù)的位數(shù),所以下面這篇文章主要給大家介紹了關于JAVA把結(jié)果保留兩位小數(shù)的3種方法,文章通過代碼介紹的非常詳細,需要的朋友可以參考下2024-08-08
springsecurity實現(xiàn)登錄驗證以及根據(jù)用戶身份跳轉(zhuǎn)不同頁面
Spring?Security是一種基于Spring框架的安全技術,用于實現(xiàn)身份驗證和訪問控制,本文介紹了如何使用Spring?Security,結(jié)合session和redis來存儲用戶信息,并通過編寫特定的登錄處理類和Web配置,實現(xiàn)用戶登錄和注銷功能2024-09-09
Mapper層繼承BaseMapper<T>需要引入的pom依賴方式
這篇文章主要介紹了Mapper層繼承BaseMapper<T>需要引入的pom依賴方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01

