Java中的AtomicInteger
类通过使用底层的CAS(Compare-And-Swap)操作来保证原子性。CAS是一种无锁算法,它允许多个线程在并发环境中安全地更新共享变量。AtomicInteger
内部使用一个整数值和一个compareAndSetState
方法来实现这个功能。
当线程想要更新AtomicInteger
的值时,它会调用compareAndSetState
方法,传入期望的当前值和新值。然后,AtomicInteger
会原子性地检查当前值是否与期望值相等。如果相等,那么AtomicInteger
会将当前值更新为新值,并返回true
。否则,它会返回false
,表示更新失败。
这个过程是原子的,因为在检查当前值和更新新值之间,没有其他线程可以修改AtomicInteger
的值。这就确保了在多线程环境下,AtomicInteger
的操作是安全的。
下面是一个简单的示例:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicIntegerExample {
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(0);
// 创建两个线程,分别增加AtomicInteger的值
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
atomicInteger.incrementAndGet();
}
});
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
atomicInteger.incrementAndGet();
}
});
// 启动线程
thread1.start();
thread2.start();
// 等待线程执行完成
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 输出AtomicInteger的最终值
System.out.println("Final value of AtomicInteger: " + atomicInteger.get());
}
}
在这个示例中,我们创建了两个线程,它们分别调用incrementAndGet()
方法来增加AtomicInteger
的值。由于AtomicInteger
使用CAS操作来保证原子性,所以最终输出的值应该是2000。