JDK提供了ThreadLocal,用于构造线程安全的对象,ThreadLocal通过Thread的ThreadLocalMap内部属性来保证线程安全,而ThreadLocalMap的key是ThreadLocal。通过map这种数据结构来存储线程相关的数据。而Netty里的FastThreadLocal是如何做到比ThreadLocal有更快的速度的呢。下面来分析Netty里FastThreadLocal的实现:
-
FastThreadLocal的构造方法如下:

set方法
-
set方法的入口

-
InternalThreadLocalMap会根据线程的实现不同,获取的方式不一样:

-
InternalThreadLocalMap是一个什么样的对象,能够比map还快速的获取到对应的数据:

-
设置数据的逻辑


总结:从上面的代码可以看出为什么FastThreadLocal比JDK的ThreadLocal快了:FastThreadLocal通过一个index属性(相当于FastThreadLocal的ID),直接从InternalThreadLocalMap的数组中定位到线程对应的值,而ThreadLocal设置值(或取值)需要从一个Map结构里取。Map结构也很高效,但有可能有数据冲突,并且需要计算hash值,然后定位到对象存在那里。相比数组的取值还是会低一些。
本文深入分析了Netty中的FastThreadLocal如何通过使用index属性和InternalThreadLocalMap的数组,实现了比JDK ThreadLocal更高效的线程局部变量存储和检索机制,避免了Map结构可能带来的数据冲突和额外的hash计算。
386

被折叠的 条评论
为什么被折叠?



