Netty分布式FastThreadLocal的set方法實(shí)現(xiàn)邏輯剖析
上一小節(jié)我們學(xué)習(xí)了FastThreadLocal的創(chuàng)建和get方法的實(shí)現(xiàn)邏輯, 這一小節(jié)學(xué)習(xí)FastThreadLocal的set方法的實(shí)現(xiàn)邏輯
FastThreadLocal的set方法實(shí)現(xiàn)
set方法, 其實(shí)就是修改線程共享對(duì)象, 作用域只是當(dāng)前線程, 我們回顧根據(jù)上一小節(jié)demo中, 其中一個(gè)線程set對(duì)象的過程:
線程set對(duì)象
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è)置的對(duì)象是不是UNSET, 因?yàn)檫@里不是UNSET, 所以進(jìn)到if塊中
if塊調(diào)用了重載的set方法, 參數(shù)仍然為InternalThreadLocalMap, 有關(guān)InternalThreadLocalMap的get操作, 上一小節(jié)已經(jīng)進(jìn)行過分析, 這里不再贅述, 同時(shí), 參數(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); } }
這里我們重點(diǎn)關(guān)注 if (threadLocalMap.setIndexedVariable(index, value)) 這部分, 這里通過threadLocalMap調(diào)用setIndexedVariable方法進(jìn)行對(duì)象的設(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; } }
這里的邏輯其實(shí)和get非常類型, 都是直接通過索引操作的, 這里根據(jù)索引值, 直接通過數(shù)組下標(biāo)的方式對(duì)元素進(jìn)行設(shè)置, 熟悉上一小節(jié)內(nèi)容的同學(xué)對(duì)此應(yīng)該不會(huì)陌生
回到FastThreadLocal的Set方法中:
public final void set(V value) { if (value != InternalThreadLocalMap.UNSET) { set(InternalThreadLocalMap.get(), value); } else { remove(); } }
剛才我們分析了如果修改的對(duì)象不是UNSET對(duì)象的操作, 如果修改的對(duì)象是UNSET對(duì)象, 則會(huì)調(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對(duì)象
回到remove方法中:
if (v != InternalThreadLocalMap.UNSET)
這里判斷如果我們?cè)O(shè)置的值不是UNSET對(duì)象, 則會(huì)調(diào)用onRemoval方法
跟進(jìn)onRemoval方法:
protected void onRemoval(@SuppressWarnings("UnusedParameters") V value) throws Exception { }
這里是個(gè)空實(shí)現(xiàn), 用于交給子類去完成
以上就是FastThreadLocal的set方法的實(shí)現(xiàn),更多關(guān)于Netty分布式FastThreadLocal的set方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JDK動(dòng)態(tài)代理原理:只能代理接口,不能代理類問題
這篇文章主要介紹了JDK動(dòng)態(tài)代理原理:只能代理接口,不能代理類問題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11springboot加載一個(gè)properties文件轉(zhuǎn)換為map方式
這篇文章主要介紹了springboot加載一個(gè)properties文件轉(zhuǎn)換為map方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Spring Boot之FilterRegistrationBean-自定義Filter詳解
這篇文章主要介紹了Spring Boot之FilterRegistrationBean-自定義Filter詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java拷貝數(shù)組方法Arrays.copyOf()是地址傳遞的證明實(shí)例
今天小編就為大家分享一篇關(guān)于Java拷貝數(shù)組方法Arrays.copyOf()是地址傳遞的證明實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10mybatis?一對(duì)多映射?column屬性的注意事項(xiàng)說明
這篇文章主要介紹了mybatis?一對(duì)多映射?column屬性的注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01IDEA搭建Maven模塊化項(xiàng)目的實(shí)現(xiàn)
本文主要介紹了IDEA搭建Maven模塊化項(xiàng)目的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05Spring AOP訪問目標(biāo)方法的參數(shù)操作示例
這篇文章主要介紹了Spring AOP訪問目標(biāo)方法的參數(shù)操作,結(jié)合實(shí)例形式詳細(xì)分析了spring面向切面AOP訪問目標(biāo)方法的參數(shù)相關(guān)實(shí)現(xiàn)步驟與操作注意事項(xiàng),需要的朋友可以參考下2020-01-01