ThreadLocal(2) - FastThreadLocal

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;

其他方法

提供了一些获取变量,删除变量,设置变量的方法

posted @   carry1899  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示