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方法的資料請關注腳本之家其它相關文章!
相關文章
springboot加載一個properties文件轉換為map方式
這篇文章主要介紹了springboot加載一個properties文件轉換為map方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07Spring Boot之FilterRegistrationBean-自定義Filter詳解
這篇文章主要介紹了Spring Boot之FilterRegistrationBean-自定義Filter詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Java拷貝數組方法Arrays.copyOf()是地址傳遞的證明實例
今天小編就為大家分享一篇關于Java拷貝數組方法Arrays.copyOf()是地址傳遞的證明實例,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10