一、原子数组(Atomic*Array)
1. 核心功能
原子数组(如AtomicIntegerArray
、AtomicLongArray
、AtomicReferenceArray
)提供对数组元素的原子操作,支持无锁并发访问,避免对整个数组加锁。
示例场景:
- 多线程并发修改数组不同元素。
- 实现高性能无锁数据结构(如环形缓冲区)。
2. 代码示例:原子计数器数组
public class AtomicArrayDemo {
private final AtomicIntegerArray counters = new AtomicIntegerArray(10); // 10个元素的原子数组
// 线程安全地递增指定索引的计数器
public void increment(int index) {
counters.getAndIncrement(index); // 原子操作:index位置的元素+1
}
// 获取所有计数器的总和
public int sum() {
int sum = 0;
for (int i = 0; i < counters.length(); i++) {
sum += counters.get(i);
}
return sum;
}
}
二、原子更新器(Atomic*FieldUpdater)
1. 核心功能
原子更新器(如AtomicIntegerFieldUpdater
、AtomicReferenceFieldUpdater
)允许直接对类的volatile字段进行原子更新,无需将字段包装为原子类,适合优化已有代码。
示例场景:
- 修改第三方库中的
volatile
字段,避免创建AtomicReference
实例。 - 减少内存开销(直接操作对象字段,无需额外包装)。
2. 代码示例:无锁对象字段更新
public class FieldUpdaterDemo {
// 目标类(字段必须为volatile)
public static class Config {
volatile String value;
}
// 创建原子更新器
private static final AtomicReferenceFieldUpdater<Config, String> updater =
AtomicReferenceFieldUpdater.newUpdater(Config.class, String.class, "value");
public static void main(String[] args) {
Config config = new Config();
updater.compareAndSet(config, null, "NewValue"); // 原子更新value字段
System.out.println(config.value); // 输出:NewValue
}
}
三、原子累加器(LongAdder、LongAccumulator)
1. 核心功能
原子累加器通过分段锁减少竞争,在高并发场景下性能显著优于AtomicLong
。
- LongAdder:专为累加操作优化(
add()
、sum()
)。 - LongAccumulator:支持自定义累加函数(如最大值、最小值)。
示例场景:
- 高并发统计(如网站访问量计数)。
- 实时聚合计算(如最小值、最大值)。
2. 代码示例:高并发计数器
public class AccumulatorDemo {
private final LongAdder totalRequests = new LongAdder(); // 总请求数
private final LongAccumulator maxLatency =
new LongAccumulator(Long::max, 0); // 最大延迟(初始值0)
// 处理请求
public void handleRequest(long latency) {
totalRequests.increment(); // 累加请求数
maxLatency.accumulate(latency); // 更新最大延迟
}
// 获取统计数据
public void printStats() {
System.out.println("Total: " + totalRequests.sum());
System.out.println("Max latency: " + maxLatency.get());
}
}