目录
一、Atomic原子变量操作类简介
在 Java 中, java.util.concurrent.atomic
包提供了一系列原子变量操作类,这些类能够在多线程环境中安全地执行操作,而无需使用显式的同步机制。原子变量操作类通过底层的硬件支持CAS 来确保操作的原子性。
二、原子变量操作类
以下是 JUC 下的一些常用原子变量操作类:
1. AtomicBoolean
:提供对 boolean
值的原子操作。
2. AtomicInteger
:提供对 int
值的原子操作。
3. AtomicLong
:提供对 long
值的原子操作。
4. AtomicReference<V>
:提供对对象引用的原子操作。
5. AtomicIntegerArray
:提供对 int
数组的原子操作。
6. AtomicLongArray
:提供对 long
数组的原子操作。
7. AtomicReferenceArray<E>
:提供对对象数组的原子操作。
8. AtomicMarkableReference<V>
:提供对对象引用及其标记的原子操作。
9. AtomicStampedReference<V>
:提供对对象引用及其版本戳的原子操作。
三、使用场景
1. 计数器
在多线程环境中,需要对某个计数器进行原子递增或递减操作。
2. 状态标志
在多线程中需要安全地设置和获取状态标志。
3. 共享资源的引用
在多线程环境中安全地更新共享对象的引用。
4. 实现无锁算法
使用原子操作可以实现一些复杂的数据结构,如无锁栈、无锁队列等。
四、代码示例
下面使用 AtomicInteger
演示如何在多线程环境中安全地递增计数器:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicIntegerExample {
private static AtomicInteger counter = new AtomicInteger(0);
public static void main(String[] args) {
// 创建多个线程
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();
// 等待线程结束
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 输出最终计数器的值
System.out.println("counter value: " + counter.get());
}
}
运行结果:
可以看到,两个线程并发地对 counter
进行递增操作。由于使用了 AtomicInteger
,可以确保最终计数器的值是 2000(即两个线程各自递增 1000 次),而不会出现线程安全问题。
其他Atomic原子变量操作类用法类似。