AtomicIntegerArray通过CAS实现无锁线程安全,初始化时复制数组不共享引用;仅保证单元素原子操作,不支持复合操作或批量排序;适用于高并发、低冲突的计数统计等场景。

Java 中使用 AtomicIntegerArray 可以在无锁(lock-free)环境下安全地并发修改整型数组,它通过底层的 CAS(Compare-and-Swap)指令实现线程安全,避免了 synchronized 或显式锁带来的开销和阻塞。
初始化原子数组
创建 AtomicIntegerArray 时需传入原始 int 数组或指定长度。注意:它**不持有原数组引用**,而是内部复制一份,后续操作与原数组完全无关。
- 从现有数组构造:
AtomicIntegerArray arr = new AtomicIntegerArray(new int[]{1, 2, 3}); - 按长度构造(所有元素默认为 0):
AtomicIntegerArray arr = new AtomicIntegerArray(10);
读写单个元素(线程安全)
所有对元素的读写都通过索引进行,方法名清晰表明语义,且全部是原子操作:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 获取值:
int x = arr.get(2);—— 等价于 volatile 读 - 设置值:
arr.set(2, 100);—— 等价于 volatile 写 - CAS 更新:
boolean success = arr.compareAndSet(0, 5, 10);—— 仅当索引 0 当前值为 5 时才设为 10 - 原子自增:
int old = arr.getAndIncrement(1);或int after = arr.incrementAndGet(1);
避免常见误用
原子数组只保证**单个元素操作的原子性**,不提供对整个数组的复合操作保护:
立即学习“Java免费学习笔记(深入)”;
- ❌ 错误:先
get(i)再set(i, newVal)并不能保证“读-改-写”原子性(这不是 CAS) - ✅ 正确:需要原子更新时,必须用
compareAndSet或updateAndGet等组合方法 - ⚠️ 注意:没有类似
Arrays.sort()的原子批量操作,排序等需自行加锁或设计无锁算法
适用场景与性能提示
AtomicIntegerArray 适合元素粒度独立、高并发读写、冲突较少的场景,比如计数器桶(hash counter)、分段统计、位图标记等:
- 优势:无锁、低暂停、高吞吐,尤其在多核 CPU 上表现好
- 代价:每次访问都涉及 volatile 语义和可能的 CPU cache 同步,频繁跨缓存行访问可能影响性能
- 建议:尽量局部化访问(如线程绑定索引),避免伪共享(false sharing)——可考虑 padding 或使用
jdk9+的@Contended(需启用 JVM 参数)

















