AtomicInteger
AtomicInteger 是 Java 并发包 (java.util.concurrent.atomic
) 中的一个原子类,用于在多线程环境下对整数进行原子操作。
核心特性
原子性
提供线程安全的原子操作(如自增、加法、比较并交换等),确保在多线程环境中操作不会被中断,避免数据竞争。
无锁机制
基于 CAS(Compare-And-Swap) 实现,通过 CPU 指令直接支持无锁并发,减少线程阻塞,提升性能。
内存可见性
内部使用 volatile
修饰的 int
值,保证修改的可见性,写操作立即对其他线程可见。
常用方法
方法 | 描述 |
---|---|
int get() | 获取当前值。 |
void set(int newValue) | 设置新值。 |
int getAndIncrement() | 相当于 i++ ,返回旧值。 |
int incrementAndGet() | 相当于 ++i ,返回新值。 |
int getAndAdd(int delta) | 原子地加上 delta ,返回旧值。 |
int addAndGet(int delta) | 原子地加上 delta ,返回新值。 |
boolean compareAndSet(int expect, int update) | 如果当前值等于 expect ,则设置为 update ,返回是否成功。 |
int updateAndGet(IntUnaryOperator updateFunction) | 应用函数更新值,返回新值。例如:x -> x * 2 。 |
底层实现
-
CAS 操作:通过
Unsafe
类调用底层 CAS 指令(如compareAndSwapInt
),在循环中不断尝试更新,直到成功。 -
volatile 变量:内部值
private volatile int value
保证可见性。
AtomicInteger 是轻量级的线程安全整数操作类,适用于单变量的原子更新场景。
import java.util.concurrent.atomic.AtomicInteger;public class ThreadSafe {static int a = 0;public static void main(String[] args) throws InterruptedException {AtomicInteger b = new AtomicInteger(0);Thread thread1 = new Thread(new Runnable() {@Overridepublic void run() {for(int i=0;i<1000;i++){a++;b.incrementAndGet();}}});Thread thread2 = new Thread(new Runnable() {@Overridepublic void run() {for(int i=0;i<1000;i++){a++;b.incrementAndGet();}}});thread1.start();thread2.start();//等待thread1与thread2执行完毕Thread.sleep(1000);System.out.println(a);//1824System.out.println(b);//2000}
}
从代码的执行结果可以看到,int类型是线程不安全的,而AtomicInteger类型则是完全线程安全的。
推荐使用AtomicInteger:1114. 按序打印 - 力扣(LeetCode)