atomicintegerarray必须通过原子方法修改元素:set()直接写入,getandset()原子交换并返回旧值,compareandset()条件更新,addandget()/incrementandget()原子增减;直接赋值或访问底层数组会破坏线程安全。

AtomicIntegerArray 不能像普通数组那样用 arr[i] = value 直接赋值,必须通过它提供的原子方法来修改元素,否则会丢失线程安全性。
用 set(int index, int newValue) 设置新值
这是最常用的方式,相当于“写入”,但不保证原子性读-改-写。它只是把指定下标位置的值设为新值,底层使用 Unsafe.putOrderedInt 或 Unsafe.putIntVolatile(取决于 JVM 实现),保证可见性和有序性。
- 适合场景:你确定要完全替换该位置的值,且不需要基于旧值计算
- 示例:
array.set(0, 42);把索引 0 处的值设为 42
用 getAndSet(int index, int newValue) 原子交换
先获取当前值,再设置新值,整个过程原子执行。返回的是**旧值**。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 适合场景:你需要知道修改前的值,比如记录变化、做简单状态切换
- 示例:
int old = array.getAndSet(1, 100);—— 索引 1 原来的值被替换成 100,old 是替换前的值
用 compareAndSet(int index, int expect, int update) 条件更新
类似乐观锁:只有当当前位置的值等于 expect 时,才把它设为 update;成功返回 true,失败返回 false。
- 适合场景:实现无锁算法、避免覆盖他人修改(如计数器增量、状态机跃迁)
- 示例:
boolean success = array.compareAndSet(2, 5, 6);—— 如果索引 2 当前是 5,就改成 6
用 addAndGet(int index, int delta) 或 incrementAndGet(int index) 做原子增减
这些方法在内部调用了 CAS 循环,确保加法操作不会因并发而丢失。
-
incrementAndGet(i)相当于getAndAdd(i, 1) + 1 -
getAndAdd(i, 5)先返回原值,再加 5 - 注意:它们只适用于数值运算,不是通用修改方式
所有修改都必须走这些方法,直接访问底层数组(array.getArray()[i] = x)会绕过原子保障,导致线程安全失效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










