volatile变量不能安全用于i++,因其读-改-写三步非原子;应改用atomicinteger的incrementandget()等原子方法。

Java 中 volatile 变量不能安全地用于自增(如 i++),因为该操作不是原子的:它包含“读取→修改→写入”三步,多线程下可能丢失更新。要安全实现自增,应改用 AtomicInteger。
为什么 volatile i++ 不安全
volatile 仅保证变量的可见性和禁止指令重排序,但不保证复合操作的原子性。
例如:volatile int count = 0;,两个线程同时执行 count++,可能都读到 0,各自加 1 后写回 1,最终结果是 1 而非预期的 2。
用 AtomicInteger 替代的基本写法
将声明和操作替换为 AtomicInteger 提供的原子方法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 原写法:
volatile int counter = 0;→counter++; - 改为:
AtomicInteger counter = new AtomicInteger(0);→counter.incrementAndGet();(返回自增后的值)或counter.getAndIncrement();(返回自增前的值)
常见自增场景对应方法
根据需求选择合适的方法:
- 等价于
i++(先取再加)→counter.getAndIncrement() - 等价于
++i(先加再取)→counter.incrementAndGet() - 等价于
i += delta→counter.addAndGet(delta)或counter.getAndAdd(delta) - 需要条件更新(如 CAS)→
counter.compareAndSet(expected, updated)
注意事项
不要混用:避免对同一个逻辑计数器既用 AtomicInteger 又保留 volatile int 字段;
无需额外同步:AtomicInteger 的方法本身已保证线程安全,不需要再加 synchronized;
初始化值要一致:构造时传入初始值,如 new AtomicInteger(100),而非依赖后续赋值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










