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的使用和建立

相关文章
相关标签/搜索