谈谈java中的LongAdder和LongAccumulator的相同点和不同点。

2021-03-07 23:09发布

8条回答
jianxiangxiong
2021-03-10 20:47

LongAdder 类是 JDK1.8 新增的一个原子性操作类. AtomicLong 通过 CAS 算法提供了非阻塞的原子性操作, 相比受用阻塞算法的同步器来说性能已经很好了, 但是 JDK 开发组并不满足于此, 因为非常搞并发的请求下 AtomicLong 的性能是不能让人接受的.

如下 AtomicLong 的 incrementAndGet 的代码, 虽然 AtomicLong 使用 CAS 算法, 但是 CAS 失败后还是通过无限循环的自旋锁不多的尝试, 这就是高并发下 CAS 性能低下的原因所在

LongAdder 类是 LongAccumulator 的一个特例, LongAccumulator 提供了比 LongAdder 更强大的功能, 如下构造函数, 其中 accumulatorFunction 是一个双目运算器接口, 根据输入的两个参数返回一个计算值, identity 则是 LongAccumulator 累加器的初始值.

LongAccumulator 相比 LongAdder 可以提供累加器初始非 0 值, 后者只能默认为 0, 另外前者还可以指定累加规则, 比如不是累加而相乘, 只需要构造 LongAccumulator 时候传入自定义双目运算器即可, 后者则内置累加规则.

一周热门 更多>