FastThreadLocal
该类位于netty的util包下,netty的线程都使用的是FastThreadLocal而不是jdk的ThreadLocal
jdk的ThreadLocal使用Thread类的ThreadLocalMap
netty的FastThreadLocal使用FastThreadLocalThread的InternalThreadLocalMap
netty的FastThreadLocal相当于是ThreadLocal的空间换时间版本
类概述
- ThreadLocal的一种特殊变体,在从FastThreadLocalThread访问时产生更高的访问性能
- 使用数组中的常量索引来查找变量,而不是使用哈希码和哈希表
- 频繁访问效率更高
- 需要搭配FastThreadLocalThread使用
FastThreadLocal<V>
成员变量
private final int index
所在线程(FastThreadLocalThread)的map(InternalThreadLocalMap)中的数组下标
实例化时通过 InternalThreadLocalMap.nextVariableIndex()
方法生成
其他方法
对应jdk的ThreadLocal类
jdk的ThreadLocal通过调用Thread上的ThreadLocalMap来操作
netty的FastThreadLocal通过调用FastThreadLocalThread上的InternalThreadLocalMap来操作
FastThreadLocalThread
继承自Thread类,也就是说,此类也可以使用jdk的ThreadLocal
netty是通过Thread是否是FastThreadLocalThread来选择用哪个ThreadLocal
成员变量
private InternalThreadLocalMap threadLocalMap
类似于jdkThread的ThreadLocalMap
其他方法
提供一些公开构造方法
InternalThreadLocalMap
FastThreadLocal最终存储的地方,类似于Thread的ThreadLocalMap
静态变量
private static final ThreadLocal<InternalThreadLocalMap> slowThreadLocalMap = new ThreadLocal<InternalThreadLocalMap>()
netty在InternalThreadLocalMap加了一个jdk的ThreadLocal
说明可以在Thread的线程局部变量中获取,相当于在非FastThreadLocalThread线程也可以使用InternalThreadLocalMap,只不过这个mao
是存储在Thread上,而不是FastThreadLocalThread
成员变量
private Object[] indexedVariables
线程本地变量最终存储的位置
此外netty还加了一些常用的线程局部变量
// 主要线程变量
private int futureListenerStackDepth;
private int localChannelReaderStackDepth;
private Map<Class<?>, Boolean> handlerSharableCache;
private IntegerHolder counterHashCode;
private ThreadLocalRandom random;
private Map<Class<?>, TypeParameterMatcher> typeParameterMatcherGetCache;
private Map<Class<?>, Map<String, TypeParameterMatcher>> typeParameterMatcherFindCache;
// String相关
private StringBuilder stringBuilder;
private Map<Charset, CharsetEncoder> charsetEncoderCache;
private Map<Charset, CharsetDecoder> charsetDecoderCache;
// ArrayList相关
private ArrayList<Object> arrayList;
其他方法
提供了一些获取变量,删除变量,设置变量的方法
标签:netty,FastThreadLocal,InternalThreadLocalMap,FastThreadLocalThread,private,Threa From: https://www.cnblogs.com/carry1899/p/16978657.html