???AtomicInteger
是 Java 中java.util.concurrent.atomic
包下的一个类。用于实现原子操作的整数。它是一个基于CAS(Compare-And-Swap)实现的原子整数类。它提供了一系列的原子操作,确保对整数的操作是原子性的,不会受到其他线程的干扰。
? ? ? ? CAS想详细了解,看这篇文章=》CAS的的底层? ? ??
??在并发编程中,当多个线程对同一个整数进行操作时,可能会出现竞态条件(Race Condition),为了避免这种情况,可以使用 AtomicInteger
来确保对整数的操作是原子性的。
AtomicInteger
提供了一系列的原子操作方法,其中常见的包括:
get()
:获取当前的值。set(int newValue)
:设置新的值。getAndIncrement()
:先获取当前的值,然后再增加1。incrementAndGet()
:先增加1,然后再获取当前的值。getAndSet(int newValue)
:获取当前的值并设置新的值。compareAndSet(int expect, int update)
:如果当前值等于期望值,则更新为新值。
以下是一个简单的示例,展示了如何在多线程环境中使用 AtomicInteger
:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicIntegerExample {
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(0);
// 启动多个线程并发地增加值
for (int i = 0; i < 5; i++) {
new Thread(() -> {
for (int j = 0; j < 1000; j++) {
atomicInteger.incrementAndGet();
}
}).start();
}
// 等待所有线程完成
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 输出最终的值
System.out.println("Final Value: " + atomicInteger.get());
}
}
????????在这个例子中,我们创建了一个初始值为 0 的 AtomicInteger
对象,并启动了 5 个线程,每个线程对该对象进行 1000 次的增加操作。通过 incrementAndGet
方法,AtomicInteger
保证了对整数的增加操作是原子的,不会出现竞态条件。
????????这个示例输出的最终值应该是 5000
,因为每个线程增加了 1000
次。使用 AtomicInteger
能够确保在并发环境中正确地进行原子操作,避免了多线程竞争导致的问题。