AtomicInteger是Java中基于CAS实现的原子整型类,用于保证多线程环境下共享变量的线程安全,其核心方法如incrementAndGet、compareAndSet等均无需加锁即可保证原子性,性能优于synchronized。

在多线程环境下,对共享变量的并发修改容易引发数据不一致问题。Java 提供了 AtomicInteger 类来解决整型变量的原子操作问题,确保线程安全,而无需使用 synchronized 关键字。
AtomicInteger 是什么?
AtomicInteger 是 java.util.concurrent.atomic 包下的一个原子类,它提供了一组原子操作方法来更新整型变量。其内部基于 CAS(Compare-And-Swap)机制实现,由 CPU 指令支持,性能优于传统的加锁方式。
常用方法说明与使用示例
以下是一些 AtomicInteger 的核心方法及其用法:
- get():获取当前值
- set(int newValue):设置新值(原子写操作)
- incrementAndGet():自增并返回新值(等价于 ++i)
- decrementAndGet():自减并返回新值
- getAndIncrement():先返回当前值,再自增(等价于 i++)
- addAndGet(int delta):加上指定值并返回结果
- getAndAdd(int delta):先返回当前值,再加指定值
- compareAndSet(int expect, int update):如果当前值等于 expect,则更新为 update,成功返回 true
示例:多个线程对计数器进行自增操作
立即学习“Java免费学习笔记(深入)”;
import java.util.concurrent.atomic.AtomicInteger;
public class Counter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet(); // 原子自增
}
public int getValue() {
return count.get();
}
}
// 测试类
public class AtomicExample {
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();
Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("最终结果: " + counter.getValue()); // 输出 2000
}
}
CAS 原理简要说明
AtomicInteger 的原子性依赖于底层的 CAS 操作。CAS 包含三个操作数:内存位置 V、预期原值 A 和新值 B。只有当内存位置的当前值等于预期值 A 时,才将该位置更新为 B,否则不做任何操作。这个过程是原子的,由处理器保证。
虽然 CAS 避免了锁的开销,但在高竞争场景下可能因反复重试影响性能,不过对于大多数计数、状态标志等场景,AtomicInteger 表现优秀。
适用场景与注意事项
AtomicInteger 适合用于简单的共享状态管理,比如计数器、序列号生成、状态标志位等。但不适合复杂业务逻辑的同步控制。
- 不能替代 volatile 在所有场景下的作用,但比 volatile 更强,支持复合操作原子性
- 不支持像 i = i + 5 这样的复合赋值的原子性,应使用 addAndGet(5)
- 不可变对象或复杂数据结构仍需使用锁或其他并发工具
基本上就这些。AtomicInteger 是实现轻量级线程安全计数的理想选择,合理使用能有效提升并发程序性能。










