AtomicInteger通过CAS实现无锁原子操作,解决多线程下共享变量竞态问题。其核心方法如incrementAndGet、compareAndSet等基于volatile和Unsafe类保证可见性与原子性,适用于计数器、状态标志等场景,避免synchronized的性能开销,提升并发效率。

在Java并发编程中,AtomicInteger 是一个提供原子操作的整型封装类,位于 red">java.util.concurrent.atomic 包下。它通过底层的CAS(Compare-And-Swap)机制保证了多线程环境下对整数变量的操作是线程安全的,而无需使用 synchronized 关键字,从而提升了性能。
为什么需要 AtomicInteger?
在多线程环境中,多个线程同时对一个共享变量进行自增操作时,普通的 int 类型或 Integer 对象无法保证操作的原子性。例如:
sharedValue++ 实际上包含三个步骤:读取值、加1、写回内存。如果多个线程同时执行,可能会出现竞态条件,导致结果不准确。
使用 synchronized 可以解决这个问题,但会带来线程阻塞和上下文切换的开销。而 AtomicInteger 利用硬件级别的原子指令(如CAS),实现了无锁的线程安全操作,效率更高。
立即学习“Java免费学习笔记(深入)”;
核心方法与原子操作
AtomicInteger 提供了一系列原子方法,常见的包括:
- get():获取当前值
- set(int newValue):设置新值
- incrementAndGet():自增并返回新值(等价于 ++i)
- getAndIncrement():先返回当前值,再自增(等价于 i++)
- addAndGet(int delta):加上指定增量并返回结果
- getAndAdd(int delta):先返回当前值,再加增量
- compareAndSet(int expect, int update):如果当前值等于 expect,则更新为 update,成功返回 true
这些方法都基于 Unsafe 类的 CAS 操作实现,确保在多线程下不会出现中间状态被覆盖的问题。
CAS 原理简析
CAS 是“比较并交换”的缩写,是一种乐观锁机制。AtomicInteger 内部维护一个 volatile 修饰的 value 字段,保证可见性。当调用 incrementAndGet() 时,会执行如下逻辑:
- 获取当前值(主内存中的最新值)
- 执行加1操作
- 通过 CAS 指令判断内存中的值是否仍等于原值,如果是,则更新;否则重试
这个过程是原子的,由 CPU 指令支持,避免了传统锁的阻塞问题。虽然在高并发下可能出现多次重试(ABA问题可通过 AtomicStampedReference 解决),但在大多数场景下性能表现优异。
典型应用场景
AtomicInteger 适用于计数器、序列号生成、状态标志等需要频繁读写共享整数变量的场景。例如:
- 统计网站访问量:每个请求到来时对 AtomicInteger 计数器加1
- 限流控制:用 AtomicInteger 记录当前并发请求数,超过阈值则拒绝服务
- 初始化标志位:确保某个资源只被初始化一次
它不适合用于复杂业务逻辑的同步控制,但对于简单的数值操作,是高效且安全的选择。
基本上就这些。理解 AtomicInteger 的作用和原理,有助于写出更高效、更安全的并发程序。关键在于明白它是如何通过 CAS 实现无锁原子操作的,以及在什么场景下使用最合适。











