并发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 并发
有哪些支持并发的集合?共源 1
Java 并发并发JavaJava 并发
元信息
审核状态: active
关联来源: 1
来源面经题(0)
这道题目前没有手动沉淀的面经题来源。
来源(1)
Java八股(并发).md
knowledge_noteQuestion 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 冲突,提升高并发场景下的吞吐量。