FastThreadLocal吞吐量居然是ThreadLocal的3倍

目前关于FastThreadLocal的很多文章都有点老有点过时了(本文将澄清几个误区),很多文章关于FastThreadLocal介绍的也不全,希望本篇文章可以带你彻底理解FastThreadLocal!!!

FastThreadLocal是Netty提供的,在池化内存分配等都有涉及到!

关于FastThreadLocal,零度准备从这几个方面进行讲解:

  • FastThreadLocal的使用。
  • FastThreadLocal并不是什么情况都快,你要用对才会快。
  • FastThreadLocal利用字节填充来解决伪共享问题。
  • FastThreadLocal比ThreadLocal快,并不是空间换时间。
  • FastThreadLocal不在使用ObjectCleaner处理泄漏,必要的时候建议重写onRemoval方法。
  • FastThreadLocal为什么快?

FastThreadLocal的使用

FastThreadLocal用法上兼容ThreadLocal

FastThreadLocal使用示例代码截图:

代码运行结果:

我们在回顾下之前的ThreadLocal的最佳实践做法:

try {
 // 其它业务逻辑
} finally {
 threadLocal对象.remove();
}

备注:通过上面的例子,我们发现FastThreadLocal和ThreadLocal在用法上面基本差不多,没有什么特别区别,个人认为,这就是FastThreadLocal成功的地方,它就是要让用户用起来和ThreadLocal没啥区别,要兼容!

使用FastThreadLocal居然不用像ThreadLocal那样先try ………………… 之后finally进行threadLocal对象.remove();

由于构造FastThreadLocalThread的时候,通过FastThreadLocalRunnable对Runnable对象进行了包装:

FastThreadLocalRunnable.wrap(target)
从而构造了FastThreadLocalRunnable对象。

FastThreadLocalRunnable在执行完之后都会调用FastThreadLocal.removeAll();

备注: FastThreadLocal不在使用ObjectCleaner处理泄漏,必要的时候建议重写onRemoval方法。关于这块将在本文后面进行介绍,这样是很多网上资料比较老的原因,这块已经去掉了。
如果是普通线程,还是应该最佳实践:
finally {
fastThreadLocal对象.removeAll();
}
注意: 如果使用FastThreadLocal就不要使用普通线程,而应该构建FastThreadLocalThread,关于为什么这样,关于这块将在本文后面进行介绍:FastThreadLocal并不是什么情况都快,你要用对才会快。

FastThreadLocal并不是什么情况都快,你要用对才会快

首先看看netty关于这块的测试用例:

代码路径:
https://github.com/netty/netty/blob/4.1/microbench/src/main/java/io/netty/microbench/concurrent/FastThreadLocalFastPathBenchmark.java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FastThreadLocal 是一个轻量级的线程局部变量管理库,相比于 Java 标准库中的 ThreadLocal,它在某些场景下可以提供更好的性能和内存管理。然而,FastThreadLocal 也有其缺点: 1. **依赖于第三方库**:引入 FastThreadLocal 需要额外的库支持,这可能会增加项目的复杂性和依赖管理的难度。 2. **不适用于所有环境**:虽然它可能在单线程或轻量级多线程应用中表现优秀,但在高并发或多线程竞争激烈的应用中,由于没有 Java 内置的同步机制,可能出现线程安全问题,特别是在处理并发读写时。 3. **缓存无效**:如果 FastThreadLocal 实例中的数据结构发生变化,且没有进行相应的清理或刷新操作,可能导致线程间的数据不一致。 4. **内存消耗**:虽然相比 ThreadLocalFastThreadLocal 可能更节省内存,但过度使用也可能导致不必要的内存碎片,尤其是在每个线程都有大量 FastThreadLocal 实例的情况下。 至于性能,FastThreadLocal 在某些情况下确实可能更快,因为它通常提供了更底层的实现和优化。然而,是否比 ThreadLocal 性能更高取决于具体的使用场景、实现细节以及代码的优化程度。一般而言,如果线程创建频繁或有复杂的共享状态管理需求,ThreadLocal 的同步机制可能会导致更多的开销。因此,选择 FastThreadLocal 还是 ThreadLocal 应该基于实际需求和性能测试。在决定使用哪种技术时,应该权衡它们之间的性能、复杂性和维护成本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值