longAdder
时间: 2025-04-03 12:11:01 AIGC 浏览: 51
### LongAdder 的用法与实现细节
`LongAdder` 是 Java 并发包 `java.util.concurrent.atomic` 中的一个类,旨在解决高并发场景下频繁更新共享变量时的竞争问题。它通过减少竞争来提高性能,特别适用于计数器场景。
#### 高效的设计理念
`LongAdder` 使用了一种称为 **分条累加(Striped Accumulation)** 的技术[^1]。其核心思想是将多个线程的增量操作分布到不同的内部单元上执行,从而降低锁争用的可能性。最终的结果可以通过汇总这些单元的值获得。
#### 主要方法概述
以下是 `LongAdder` 提供的一些常用方法及其功能:
- **`increment()`**: 将当前值增加 1。
- **`decrement()`**: 将当前值减去 1。
- **`add(long x)`**: 增加指定数值。
- **`sum()` 或者 `longValue()`**: 返回累积计算后的总和。
需要注意的是,在多线程环境中调用 `sum()` 方法会触发一次同步的操作以确保数据一致性[^2]。
#### 实现机制剖析
为了提升效率并减少冲突,`LongAdder` 维护了一个数组结构用于存储各个独立的部分求和结果。每当某个线程尝试修改该对象时,如果发现对应槽位未被占用,则直接写入;否则采用 CAS(Compare And Swap)算法寻找新的位置记录变化量。这种策略有效缓解了传统原子类型如 AtomicLong 所面临的瓶颈问题——即当大量线程同时访问同一内存地址时产生的激烈争夺现象[^3]。
下面展示如何创建以及使用一个简单的例子:
```java
import java.util.concurrent.atomic.LongAdder;
public class Main {
public static void main(String[] args) throws InterruptedException {
final int THREAD_COUNT = 10;
Thread[] threads = new Thread[THREAD_COUNT];
LongAdder counter = new LongAdder();
for(int i=0;i<THREAD_COUNT;i++) {
threads[i]=new Thread(()->{
for(int j=0;j<1000;j++) {
counter.increment();
}
});
threads[i].start();
}
for(Thread t : threads){
t.join(); // wait until all thread finish their job.
}
System.out.println("Total count:"+counter.sum());
}
}
```
上述程序展示了利用 `LongAdder` 来统计来自不同线程贡献次数的方式,并验证最后得到总数是否正确无误。
#### 性能对比分析
相较于传统的 `AtomicLong`, 在极高频率读写的条件下,由于引入了额外的空间开销换取时间上的优化,因此可以观察到显著优于前者的表现特性。然而对于低负载或者单一线程应用场合来说,可能并不会体现出明显优势甚至稍逊一筹因为存在初始化成本等因素影响。
---
阅读全文
相关推荐


















