2021-03-07 23:09发布
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 时候传入自定义双目运算器即可, 后者则内置累加规则.
最多设置5个标签!
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 时候传入自定义双目运算器即可, 后者则内置累加规则.
一周热门 更多>