模型服务连接失败

LongAdder 是什么?相比 AtomicLong 有什么优势?

并发JavaJava 并发
分类
Java 并发
难度
未设置
来源数
1
更新时间
2026/03/28 21:25

答案

longaddr是JDK1.8新增的一个类。在之前的原子类当中,是基于CAS操作来实现原子性的,但是当并发量大起来之后,频繁的重试会大量消耗CPU资源,因此Longaddr就是为了解决这个问题,它采用了分段锁的思想,每个线程在不同的位置进行累加,提高了整体的并发量。 具体而言,longaddr方法中包含一个base变量和一个cell数组,当不存在竞争时,线程直接在base上进行累加,当存在竞争时,即一个线程CAS操作失败时,就会对cell数组进行初始化,并且根据当前线程的hash值映射到相应槽位,并执行cas操作更新当前槽位的值,若更新失败则会调用longaccumulate方法对数组进行扩容。在扩容过程中,也是使用CAS操作,如果数组正在扩容,则会直接尝试在base上进行增加。(初始容量为2,两倍扩容)

相关题目(5)

Java 并发并发JavaJava 并发
Java 并发并发JavaJava 并发
Java 并发并发JavaJava 并发
Java 并发并发JavaJava 并发
Java 并发并发JavaJava 并发

元信息

审核状态: active
关联来源: 1

来源面经题(0)

这道题目前没有手动沉淀的面经题来源。

来源(1)

Java八股(并发).md

knowledge_note
Question 52: LongAdder 是什么?相比 AtomicLong 有什么优势? Source answer: longaddr是JDK1.8新增的一个类。在之前的原子类当中,是基于CAS操作来实现原子性的,但是当并发量大起来之后,频繁的重试会大量消耗CPU资源,因此Longaddr就是为了解决这个问题,它采用了分段锁的思想,每个线程在不同的位置进行累加,提高了整体的并发量。 具体而言,longaddr方法中包含一个base变量和一个cell数组,当不存在竞争时,线程直接在base上进行累加,当存在竞争时,即一个线程CAS操作失败时,就会对cell数组进行初始化,并且根据当前线程的hash值映射到相应槽位,并执行cas操作更新当前槽位的值,若更新失败则会调用longaccumulate方法对数组进行扩容。在扩容过程中,也是使用CAS操作,如果数组正在扩容,则会直接尝试在base上进行增加。(初始容量为2,两倍扩容) Reviewed answer: LongAdder 是 JDK 1.8 引入的高并发累加器。低竞争时直接更新 base,高竞争时将更新分散到多个 Cell 上,最后汇总结果,从而减少单点 CAS 冲突,提升高并发场景下的吞吐量。