【J.U.C】LongAdder与AtomicLong
引言
前一阵子看ConcurrentHashMap的源码,其中计数部分提及到LongAdder,之后看了一下LongAdder,发现他们实现的思路是一样的,都是将单节点的并发分散到多个节点。
LongAdder的使用场景也就适用于高并发的情形。比如QPS的计算,在多个线程频发更新QPS的时候,效率会很高。
计数选型:
单线程那直接用Long最好了,并发不高的情况用AtomicLong,并发高时选LongAdder。
AtomicLong,并发都作用到了单一的volatile的value上。
java
1 | private volatile long value; |
而LongAdder将并发分散到了多个Cell上,增加实现比较复杂,但是在高并发场景确实比较优秀。
java
1 | /** |
LongAdder将竞争数据按照线程的粒度进行分离,相比所有竞争线程对一个共享变量使用CAS不断尝试在性能上要效率多了,这也是为什么在高并发环境下LongAdder要优于AtomicLong的原因。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ClawHub的技术分享!