atomicintegerarray是java并发包中基于cas实现线程安全整数数组的工具类,支持每个元素独立原子操作,适用于高频、细粒度、索引确定的整数更新场景。

AtomicIntegerArray 是 Java 并发包(java.util.concurrent.atomic)中提供的一个线程安全的整数数组工具类,它通过底层 CAS(Compare-and-Swap)操作实现无锁原子更新,避免了使用 synchronized 或显式锁带来的开销和复杂性。
为什么不用普通 int[] 或 synchronized 包裹?
普通数组本身不具备原子性:即使数组引用是 volatile 的,对单个元素的读写(如 arr[i]++)仍包含“读-改-写”三步,多线程下会丢失更新。加锁虽能解决,但粒度粗、易阻塞、扩展性差。而 AtomicIntegerArray 对每个元素独立支持原子操作,多个线程可同时安全修改不同索引位置,互不干扰。
核心用法:初始化与原子更新
创建后,所有操作都基于索引进行,不提供整体批量操作:
- 初始化方式:
new AtomicIntegerArray(int length)或new AtomicIntegerArray(int[] array)(复制值,非引用) - 获取值:
get(int i)—— 线程安全读取 - 设置值:
set(int i, int newValue)—— 线程安全写入(非原子更新) - 原子自增:
incrementAndGet(int i)、getAndIncrement(int i) - 条件更新:
compareAndSet(int i, int expect, int update)—— 成功返回 true,失败不抛异常 - 加法更新:
addAndGet(int i, int delta)、getAndAdd(int i, int delta)
典型场景示例:计数器分片统计
比如统计 100 万个请求中各响应码(如 200、404、500)出现次数。用单个 AtomicInteger 会成为热点;用 AtomicIntegerArray 按状态码映射到索引(如 200→0,404→1,500→2),则三个线程可并行更新不同位置:
AtomicIntegerArray counts = new AtomicIntegerArray(3); // 索引 0/1/2 对应三类状态码 // 线程中: if (status == 200) counts.incrementAndGet(0); else if (status == 404) counts.incrementAndGet(1); else if (status == 500) counts.incrementAndGet(2);
无需同步块,无锁竞争,吞吐量高。
注意事项与限制
- 不支持动态扩容:长度固定,需预估容量
-
不提供迭代器或流式 API:遍历需手动 for 循环调用
get(i) -
get/set 不是 volatile 语义的完全替代:虽然内部用 volatile 读写数组元素,但
get()和set()本身是原子的,适合大多数场景;若需严格 happens-before 保证(如配合其他共享变量),建议搭配lazySet(int i, int newValue)或明确使用get()/set() - 慎用于大数组高频随机更新:CAS 失败会重试,极端争用下可能影响性能(但比锁仍更优)
它不是万能数组,而是为「频繁、细粒度、索引确定」的整数更新场景量身设计的轻量级并发工具。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











