FastThreadLocal

本文深入分析了Netty中的FastThreadLocal如何通过使用index属性和InternalThreadLocalMap的数组,实现了比JDK ThreadLocal更高效的线程局部变量存储和检索机制,避免了Map结构可能带来的数据冲突和额外的hash计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  • FastThreadLocal的构造方法如下:
    5796101-5bc148bc8d64ce8d.png
set方法
  • set方法的入口
    5796101-8a8ebd7f31a7ae90.png
  • InternalThreadLocalMap会根据线程的实现不同,获取的方式不一样:
    5796101-dfd530196bd88713.png
  • InternalThreadLocalMap是一个什么样的对象,能够比map还快速的获取到对应的数据:
    5796101-e94e788dcafd5de4.png
  • 设置数据的逻辑
    5796101-47301f47d1891e8f.png
    5796101-ea0cd25c1c61809b.png

    总结:从上面的代码可以看出为什么FastThreadLocal比JDK的ThreadLocal快了:FastThreadLocal通过一个index属性(相当于FastThreadLocal的ID),直接从InternalThreadLocalMap的数组中定位到线程对应的值,而ThreadLocal设置值(或取值)需要从一个Map结构里取。Map结构也很高效,但有可能有数据冲突,并且需要计算hash值,然后定位到对象存在那里。相比数组的取值还是会低一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值