既然已经有了 Atomiclnteger,为什么 JDK还要引入 LongAdder 类?
AtomicInteger 是一个很好的并发工具,但在高并发情况下,如果有大量线程同时进行更新操作,会导致大量的 CAS 操作失败并自旋重试,这会消耗大量的 CPU 资源,影响性能。
为了解决这个问题,JDK 8 引入了 LongAdder。LongAdder 在内部维护了一个 Cell 数组,每个 Cell 独立进行累加操作,这样就可以减少线程间的竞争。当多个线程尝试同时更新时,LongAdder 可以动态扩展 Cell 数组的大小,使得每个线程更新一个独立的 Cell,进一步减少竞争。最后获取结果时,将所有 Cell 的值累加即可。
因此,相比 AtomicInteger,LongAdder 在高并发情况下可以提供更好的性能,但在并发度较低时,由于需要维护更多的数据结构,其性能可能略低于 AtomicInteger。
总的来说,如果累加操作的并发度非常高,或者需要进行大量的累加操作,建议使用 LongAdder。如果并发度较低,或者除了累加操作外还需要执行其他复杂的原子操作,可以选择 AtomicInteger。