atomicintegerarray是java并发包中线程安全更新整型数组单个元素的无锁工具类,基于cas实现索引级原子操作,适用于多线程高频修改固定下标场景。

AtomicIntegerArray 是 Java 并发包(java.util.concurrent.atomic)中用于**线程安全地更新整型数组元素**的工具类。它不提供整体数组的原子操作(比如原子性替换整个数组),但能保证对**单个索引位置的读、写、更新操作是原子且无锁的**,适合多线程频繁修改数组某几个固定下标的场景。
为什么不用普通 int[] 或 synchronized?
普通 int[] 没有内存可见性和原子性保障:一个线程修改后,其他线程可能看不到最新值;复合操作(如“先读再加再写”)更不是原子的。
用 synchronized 虽然安全,但粒度粗(常需锁整个数组或对象),易造成竞争和阻塞。AtomicIntegerArray 基于 CAS(Compare-and-Swap)指令实现,**每个元素独立维护状态,更新时只锁定当前索引,无锁、低开销、高并发友好**。
核心用法:初始化与常用方法
创建方式有两种:
- 传入长度:
new AtomicIntegerArray(10)—— 内部新建长度为 10 的 int 数组,所有元素初始为 0 - 传入现有数组:
new AtomicIntegerArray(new int[]{1,2,3})—— 复制一份快照,后续原数组变化不影响它
关键方法(全部线程安全):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
get(int i):获取索引i处当前值 -
set(int i, int newValue):设置索引i处为新值(等价于 volatile 写) -
getAndSet(int i, int newValue):获取旧值并设为新值(原子交换) -
compareAndSet(int i, int expect, int update):CAS 操作——仅当当前值等于expect时,才设为update,返回是否成功 -
getAndIncrement(int i)/incrementAndGet(int i):原子自增(类似AtomicInteger) -
getAndAdd(int i, int delta)/addAndGet(int i, int delta):原子加法
典型使用示例:计数器分片
比如统计 100 万个请求落在 10 个桶中的分布,多个线程并发更新:
AtomicIntegerArray buckets = new AtomicIntegerArray(10); // 线程中执行 int bucketId = request.hashCode() % 10; buckets.incrementAndGet(bucketId); // 线程安全,无需同步
对比用 synchronized(buckets) 或 ReentrantLock,这里每个桶独立更新,完全无竞争;而用普通数组 + 锁,所有线程会排队更新同一个锁。
注意事项与常见误区
- 不支持动态扩容:数组长度固定,初始化后不能改变
- 没有“原子性遍历”或“批量更新”:无法保证多次 get() 结果的一致性,也不能原子性地更新多个索引
- get() 和 set() 是 volatile 语义,不是强一致快照:某次遍历过程中,不同索引可能反映不同时间点的值
-
慎用 length 属性:虽然有
length()方法,但它只是返回构造时的长度,不是实时可变的 -
不要误以为它替代 ArrayList
:后者每个元素是独立对象,内存开销大;而 AtomicIntegerArray底层是紧凑的 int 数组,更省内存、缓存更友好
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










