在Java中,原子类是一组特殊的类,它们提供了一种线程安全的方式来执行原子操作。原子操作是不可中断的单个操作,它要么完全执行成功,要么完全不执行。Java提供了多个原子类,其中一些常见的原子类包括:
- AtomicInteger:用于对整数进行原子操作。
- AtomicLong:用于对长整型进行原子操作。
- AtomicBoolean:用于对布尔值进行原子操作。
- AtomicReference:用于对引用类型进行原子操作。
- AtomicIntegerArray:用于对整数数组进行原子操作。
- AtomicLongArray:用于对长整型数组进行原子操作。
- AtomicStampedReference:带有标记的引用类型原子操作。
- AtomicIntegerFieldUpdater:用于对指定类的整数字段进行原子更新。
这些原子类的原理基于底层的硬件支持和CAS(Compare and Swap)操作。CAS是一种并发原语,它通过比较内存中的值与预期值,如果相等则进行更新操作,否则重新尝试。这个过程是原子的,不会被其他线程中断。
下面是一个简单的代码演示,展示了如何使用AtomicInteger进行原子操作:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicDemo {
private static AtomicInteger counter = new AtomicInteger(0);
public static void main(String[] args) {
// 创建两个线程,分别对 counter 进行自增操作
Thread thread1 = new Thread(new IncrementTask());
Thread thread2 = new Thread(new IncrementTask());
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Final value: " + counter.get());
}
static class IncrementTask implements Runnable {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
counter.incrementAndGet(); // 自增操作
}
}
}
}
在这个例子中,我们创建了两个线程并发地对counter
进行1000次自增操作。由于AtomicInteger
的使用,每次自增操作都是原子的,因此最终输出的结果应该是2000。