atomicintegerarray用于多线程下对整型数组单个元素的原子操作,基于unsafe cas实现无锁高效并发,不支持数组扩容或整体原子操作。

Java 中 AtomicIntegerArray 用于在多线程环境下对整型数组的单个元素执行原子操作,它不保证整个数组操作的原子性,但能确保对每个索引位置的读、写、更新(如自增、比较并交换)是线程安全的。
为什么不能直接用普通数组 + synchronized?
普通数组本身不可被 synchronized 锁住(锁对象需是引用类型),若用 synchronized(arr) 实际锁的是数组引用,无法控制多个线程对不同下标的并发修改;而为每个下标单独加锁又带来粒度粗、性能差、易死锁等问题。AtomicIntegerArray 内部基于 Unsafe 的 CAS 操作实现无锁并发,更轻量高效。
基本用法:初始化与常见原子操作
创建后,所有操作都以索引为单位进行,不支持扩容或整体替换:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 初始化:可传入长度或已有 int[] 数组(注意:会复制值,后续修改原数组不影响 AtomicIntegerArray)
-
get(int i)和set(int i, int newValue):线程安全的读写 -
getAndIncrement(int i)/incrementAndGet(int i):类似i++或++i -
compareAndSet(int i, int expect, int update):CAS 更新,成功返回 true -
addAndGet(int i, int delta):原子加法,返回新值
典型场景示例:计数器分片统计
比如统计多个类别访问次数,避免全局锁竞争:
// 假设 10 个分类,用 AtomicIntegerArray 分片计数 AtomicIntegerArray counts = new AtomicIntegerArray(10); // 多线程中根据 categoryID 更新对应位置 int categoryId = getCategoryId(); // 0~9 counts.incrementAndGet(categoryId);
相比用 ConcurrentHashMap<integer atomicinteger></integer> 或同步块,这种方式内存更紧凑、无对象开销、CAS 更快,适合固定大小且索引明确的场景。
注意事项与限制
使用时需留意以下几点:
- 数组长度固定,创建后不可变
- 不提供迭代器或批量操作,遍历需手动循环调用
get(i) - 不保证数组整体的可见性顺序,但每个元素的更新对其他线程立即可见(基于 volatile 语义)
- 慎用
toString()——它返回的是内部数组快照,非实时状态,仅适合调试 - 如果需要对多个下标做原子组合操作(如“同时加 A 和减 B”),AtomicIntegerArray 无法保证,得回退到显式锁或其他协调机制
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










