JDK1.8时,java.util.concurrent.atomic
包中提供了一个新的原子类:LongAdder
。
根据Oracle官方文档的介绍,LongAdder在高并发的场景下会比它的前辈AtomicLong具有更好的性能,代价是消耗更多的内存空间。
引入这个类的原因是,在并发量很高的情况下,自旋CAS会出现大量失败并不断自旋的情况,此时AtomicLong的自旋会成为瓶颈。
而LongAdder通过分散热点,将value值分散到一个数组中,不同线程会命中数组的不同槽中,各个线程只对自己槽中的那个值进行CAS操作,这样热点就被分散了,冲突的概率就小很多。如果要获取真正的long值,只要将各个槽中的变量值累加返回(需要注意的是,只能返回某个时刻的近似值,因为累加返回的时候其它线程可能还在修改值)。
JDK1.8时,java.util.concurrent.atomic
包中,除了新引入LongAdder外,还有引入了它的三个兄弟类:LongAccumulator、DoubleAdder、DoubleAccumulator
LongAdder只能进行数值的加减运算,而LongAccumulator提供了自定义的函数操作。至于DoubleAdder、DoubleAccumulator就是将Long类型换成了Double类型。