Netty源碼分析第8章(高性能工具類FastThreadLocal和Recycler)---->第2節: FastThreadLocal的set方法

 

Netty源碼分析第八章: 高性能工具類FastThreadLocal和Recyclerhtml

 

第二節: FastThreadLocal的set方法數組

 

上一小節咱們學習了FastThreadLocal的建立和get方法的實現邏輯, 這一小節學習FastThreadLocal的set方法的實現邏輯ide

set方法, 其實就是修改線程共享對象, 做用域只是當前線程, 咱們回顧根據上一小節demo中, 其中一個線程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方法中:this

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的下標和valuespa

咱們跟到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 { }

這裏是個空實現, 用於交給子類去完成

以上就是FastThreadLocal的set方法的實現

 

上一節: FastThreadLocal的使用和建立

下一節: recycler的使用和建立

相關文章
相關標籤/搜索