在 Java 中,java.util.concurrent.atomic
包提供了一组原子类,用于实现原子性操作,避免了多线程并发访问时可能出现的竞态条件。这些原子类使用底层的 CAS(Compare-And-Swap)操作,保证了操作的原子性。
CAS 操作包含三个参数:内存位置 V,旧的预期值 A 和新值 B。CAS 操作的语义是:“只有当 V 的值等于 A 时,将 V 的值设置为 B,否则什么都不做”。
以下是一个简单的代码示例,演示了 AtomicInteger
的使用:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicIntegerExample {
public static void main(String[] args) throws InterruptedException {
AtomicInteger counter = new AtomicInteger(0);
// 使用多线程对 counter 进行增加操作
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.incrementAndGet(); // 原子性增加
}
});
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.incrementAndGet(); // 原子性增加
}
});
thread1.start();
thread2.start();
thread1.join();
thread2.join();
// 输出最终结果
System.out.println("Final Counter Value: " + counter.get());
}
}
在上述示例中,AtomicInteger
类的 incrementAndGet()
方法是原子性的,它使用 CAS 操作确保了对共享变量 counter
的原子性操作。即使多个线程并发执行增加操作,最终的结果也是正确的。