FastThreadLocal

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值,然后定位到对象存在那里。相比数组的取值还是会低一些。

推荐阅读更多精彩内容