AtomicIntegerArray仅保证单元素操作的原子性,不保证数组整体原子性或可见性;须仅用其原子方法(如incrementAndGet、compareAndSet)操作单个索引,禁用直接访问或get+set组合,构造时复制原数组且不支持批量原子操作。

AtomicIntegerArray 通过底层 CAS(Compare-And-Swap)机制保证单个元素的读写原子性,但**不保证整个数组操作的原子性或可见性**。要安全修改数组元素,关键在于:只用它提供的原子方法操作单个索引位置,避免直接访问 array[index],也不依赖数组整体状态做复合判断。
只用原子方法修改单个元素
所有修改必须调用 AtomicIntegerArray 自带的方法,例如:
-
incrementAndGet(int i):对索引i处元素原子加 1 并返回新值 -
compareAndSet(int i, int expect, int update):仅当当前值等于expect时,才设为update,返回是否成功 -
addAndGet(int i, int delta):原子增加指定增量 -
set(int i, int newValue):原子写入(注意:这不是 CAS,但线程安全)
❌ 错误示范:
int old = atomicArray.get(i);<br> atomicArray.set(i, old + 1); // 非原子!中间可能被其他线程修改
需要条件更新时,用 compareAndSet 循环重试
如果逻辑依赖“读取→判断→更新”三步(比如“只有当前值小于 10 才加 1”),不能拆成 get + set,而应使用 CAS 自旋:
int i = 2;
int current;
int next;
do {
current = atomicArray.get(i);
if (current >= 10) break; // 不满足条件,退出
next = current + 1;
} while (!atomicArray.compareAndSet(i, current, next));
这是标准的无锁编程模式,CAS 失败就重读重试,确保逻辑原子执行。
立即学习“Java免费学习笔记(深入)”;
注意:数组引用本身不可变,且不提供批量原子操作
AtomicIntegerArray 在构造时会**复制传入的原始数组**,后续对原数组的修改完全不影响它,反之亦然:
- ✅ 安全:构造后只通过 AtomicIntegerArray 实例操作
- ❌ 危险:把内部数组通过
getArray()暴露出去并直接修改——这会破坏原子性保障 - ⚠️ 注意:
getArray()返回的是快照副本,仅用于只读观察,不能用于写入
它也不支持类似“同时更新索引 0 和 1”的原子批量操作。如需多元素协同,得配合锁(如 ReentrantLock)或更高级结构(如 StampedLock)。
适用于计数器场景,不适合复杂状态管理
AtomicIntegerArray 最适合独立、无依赖的整数计数场景,例如:
- 分桶计数器(按用户 ID 取模分组统计请求次数)
- 状态标志数组(每个元素代表一个资源是否可用)
- 轻量级频率限制器中的滑动窗口槽位
如果元素之间存在约束(如“总和不能超过 100”),或者需要迭代全部元素做聚合计算,就不适合直接用 AtomicIntegerArray,应考虑 ConcurrentHashMap、LongAdder 或显式同步控制。


















