atomiclongarray 是 java 并发包中线程安全的 long 数组类,支持单元素级无锁原子操作(如 get、set、cas、addandget),不支持扩容与批量原子操作,适用于高并发下独立索引频繁更新场景。

AtomicLongArray 是 Java 并发包(java.util.concurrent.atomic)中提供的线程安全数组类,用于对 long 类型数组元素执行无锁、原子性的读写和更新操作。它不保证整个数组操作的原子性(比如批量赋值),但能确保**单个元素的读、写、CAS、加减等操作是原子的**,适合高并发下对数组中独立位置频繁修改的场景。
为什么不用普通 long[] + synchronized?
普通数组本身不是线程安全的;若用 synchronized 保护整个数组,会严重限制并发度——哪怕两个线程操作的是不同下标,也会互相阻塞。而 AtomicLongArray 内部基于 Unsafe 的 CAS 指令实现单元素级原子操作,无锁且细粒度,性能更高。
常用原子操作方法详解
创建后,所有操作都以索引为单位,不涉及数组整体:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
get(int i):原子读取索引i处的值(相当于 volatile 读) -
set(int i, long newValue):原子写入(相当于 volatile 写) -
compareAndSet(int i, long expect, long update):CAS 更新——仅当当前值等于expect时,才设为update,返回是否成功 -
getAndIncrement(int i)/incrementAndGet(int i):原子自增,类似++的两种语义 -
addAndGet(int i, long delta):原子加指定值并返回新值(最常用,如计数累加)
典型使用示例:并发计数器数组
假设要统计 10 个不同业务模块的请求次数,每个模块对应一个计数器:
AtomicLongArray counters = new AtomicLongArray(10); // 初始化 10 个 long 元素,初始值全为 0 // 线程 A:模块 3 收到请求 counters.incrementAndGet(3); // 线程 B:模块 3 再次收到请求 counters.incrementAndGet(3); // 安全,结果为 2 // 线程 C:模块 7 加 5 次 counters.addAndGet(7, 5); // 获取当前模块 3 的计数值(非阻塞) long current = counters.get(3);
注意:AtomicLongArray 构造时需传入长度,**不支持扩容**;数组大小固定,元素初始值默认为 0(不可自定义)。
注意事项与限制
- 数组长度在构造后不可变,如需动态扩展,需自行封装或换用其他结构(如
ConcurrentHashMap<integer long></integer>) - 不提供“对整个数组求和”“查找最大值”等聚合操作——这些需手动遍历调用
get(i),期间值可能被其他线程修改,结果仅为某一时刻快照 - 内部使用
Unsafe和偏移量计算定位元素,因此比普通数组稍慢(但远快于锁);对极致性能敏感场景可做基准测试对比 - 与
AtomicIntegerArray、AtomicReferenceArray设计一致,只是类型不同
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










