jdk自带的ThreadLocal和netty扩展的FastThreadLocal比较总结
2017-02-05 16:20
821 查看
最近在分析一潜在内存泄露问题的时候,jmap出来中有很多的FastThreadLocalThread实例,看了下javadoc,如下:
A special variant of
Internally, a
To take advantage of this thread-local variable, your thread must be a
Note that the fast path is only possible on threads that extend
简单地说,就是在
为了大概了解下差距会有多少,搜了下,有个帖子(https://my.oschina.net/andylucc/blog/614359)进行了测试,例子中结果如下:
1000个ThreadLocal对应一个线程对象的100w次的计时读操作:
ThreadLocal:3767ms | 3636ms | 3595ms | 3610ms | 3719ms
FastThreadLocal: 15ms | 14ms | 13ms | 14ms | 14ms
1000个ThreadLocal对应一个线程对象的10w次的计时读操作:
ThreadLocal:384ms | 378ms | 366ms | 647ms | 372ms
FastThreadLocal:14ms | 13ms | 13ms | 17ms | 13ms
1000个ThreadLocal对应一个线程对象的1w次的计时读操作:
ThreadLocal:43ms | 42ms | 42ms | 56ms | 45ms
FastThreadLocal:15ms | 13ms | 11ms | 15ms | 11ms
100个ThreadLocal对应一个线程对象的1w次的计时读操作:
ThreadLocal:16ms | 21ms | 18ms | 16ms | 18ms
FastThreadLocal:15ms | 15ms | 15ms | 17ms | 18ms
上面的实验数据可以看出,当ThreadLocal数量和读写ThreadLocal的频率较高的时候,传统的ThreadLocal的性能下降速度比较快,而Netty实现的FastThreadLocal性能比较稳定。上面实验模拟的场景不够具体,但是已经在一定程度上我们可以认为,FastThreadLocal相比传统的的ThreadLocal在高并发高负载环境下表现的比较优秀。
总结来说,根据经验,个人认为99%的应用中不会使用超过成千上万个线程本地变量,所以除非极为特殊的应用,出于后续维护成本的考虑,使用传统的ThreadLocal就可以了,没必要使用FastThreadLocal。
PS:关于threadlocal的场景,就不重复阐述了,可参考下列两个帖子:
https://my.oschina.net/clopopo/blog/149368 http://blog.csdn.net/lufeng20/article/details/24314381 http://lavasoft.blog.51cto.com/62575/51926/
A special variant of
ThreadLocalthat yields higher access performance when accessed from a
FastThreadLocalThread.
Internally, a
FastThreadLocaluses a constant index in an array, instead of using hash code and hash table, to look for a variable. Although seemingly very subtle, it yields slight performance advantage over using a hash table, and it is useful when accessed frequently.
To take advantage of this thread-local variable, your thread must be a
FastThreadLocalThreador its subtype. By default, all threads created by
DefaultThreadFactoryare
FastThreadLocalThreaddue to this reason.
Note that the fast path is only possible on threads that extend
FastThreadLocalThread, because it requires a special field to store the necessary state. An access by any other kind of thread falls back to a regular
ThreadLocal.
简单地说,就是在
FastThreadLocalThread线程内访问性能会更快的ThreadLocal的一种实现。其使用常量索引而非hash值作为索引进行变量查找。
对于使用默认线程池的情况,netty会使用DefaultTrheadFactory创建FastThreadLocalThread线程,而非原生的Thread,其源码位置如下:根据之前对比java测试c++各种map、unordered_map的记忆,一般来说map中值越多、各种实现的差距越大(因为潜在的冲突增加以及底层的实现为b*或者链表或者线性等)。
为了大概了解下差距会有多少,搜了下,有个帖子(https://my.oschina.net/andylucc/blog/614359)进行了测试,例子中结果如下:
1000个ThreadLocal对应一个线程对象的100w次的计时读操作:
ThreadLocal:3767ms | 3636ms | 3595ms | 3610ms | 3719ms
FastThreadLocal: 15ms | 14ms | 13ms | 14ms | 14ms
1000个ThreadLocal对应一个线程对象的10w次的计时读操作:
ThreadLocal:384ms | 378ms | 366ms | 647ms | 372ms
FastThreadLocal:14ms | 13ms | 13ms | 17ms | 13ms
1000个ThreadLocal对应一个线程对象的1w次的计时读操作:
ThreadLocal:43ms | 42ms | 42ms | 56ms | 45ms
FastThreadLocal:15ms | 13ms | 11ms | 15ms | 11ms
100个ThreadLocal对应一个线程对象的1w次的计时读操作:
ThreadLocal:16ms | 21ms | 18ms | 16ms | 18ms
FastThreadLocal:15ms | 15ms | 15ms | 17ms | 18ms
上面的实验数据可以看出,当ThreadLocal数量和读写ThreadLocal的频率较高的时候,传统的ThreadLocal的性能下降速度比较快,而Netty实现的FastThreadLocal性能比较稳定。上面实验模拟的场景不够具体,但是已经在一定程度上我们可以认为,FastThreadLocal相比传统的的ThreadLocal在高并发高负载环境下表现的比较优秀。
总结来说,根据经验,个人认为99%的应用中不会使用超过成千上万个线程本地变量,所以除非极为特殊的应用,出于后续维护成本的考虑,使用传统的ThreadLocal就可以了,没必要使用FastThreadLocal。
PS:关于threadlocal的场景,就不重复阐述了,可参考下列两个帖子:
https://my.oschina.net/clopopo/blog/149368 http://blog.csdn.net/lufeng20/article/details/24314381 http://lavasoft.blog.51cto.com/62575/51926/
相关文章推荐
- 好记性不如烂笔头48-java拦截器-JDK自带动态代理和CGLIB效率比较(3)
- 【JDK源码】ArrayList线程不安全详解—Fail-Fast机制总结
- 命令行下JDK自带编译javac和执行java,以及环境变量的原理总结
- Netty的FastThreadLocal
- 基于jdk的网络编程和使用Netty的比较
- Android源码自带的ProgressBar的总结与扩展——自定义ProgressDialog
- Java中解锁数组正确姿势以及赋值,foreach遍历?,Java自带的对数组排序,比较等等的静态方法总结
- JDK自带的二分查找算法和自己写的普通二分查找算法的比较(java二分查找源代码)
- RCNN,fast RCNN,faster RCNN比较归纳总结(一)
- 总结学习! xml与java对象转换 --- JDK自带的JAXB(Java Architecture for XML Binding)
- 建议FastDateFormat来代替JDK自带的DateFormat
- RCNN,fast RCNN,faster RCNN比较归纳总结(一)
- 使用FastDateFormat来代替JDK自带的DateFormat
- WebService技术总结(一):jdk自带的WebService API:jaxws
- Netty 高性能之道 FastThreadLocal 源码分析(快且安全)
- 使用FastDateFormat来代替JDK自带的DateFormat
- char* string CString比较总结
- 自己总结的一个移动菜单方法,比较简陋哦
- 信息安全(SAML,XACML,WSS)总结与比较
- xml总结(六)dom4j,xml处理技术比较