Java 中的 原子类(Atomic Classes) 是 java.util.concurrent.atomic
包中提供的一组线程安全的类,用于在多线程环境下实现无锁的原子操作。这些类通过 CAS(Compare-And-Swap)操作来保证线程安全,避免了使用锁带来的性能开销。以下是 Java 中常见的原子类及其用途:
1. 基本类型原子类
AtomicInteger
:- 用于对
int
类型进行原子操作。 - 常用方法:
get()
、set()
、getAndSet()
、compareAndSet()
、incrementAndGet()
、decrementAndGet()
等。
- 用于对
AtomicLong
:- 用于对
long
类型进行原子操作。 - 常用方法与
AtomicInteger
类似。
- 用于对
AtomicBoolean
:- 用于对
boolean
类型进行原子操作。 - 常用方法:
get()
、set()
、compareAndSet()
等。
- 用于对
2. 引用类型原子类
AtomicReference<V>
:- 用于对引用类型进行原子操作。
- 常用方法:
get()
、set()
、compareAndSet()
等。
AtomicStampedReference<V>
:- 在
AtomicReference
的基础上增加了版本号(Stamp),用于解决 ABA 问题。 - 常用方法:
getReference()
、getStamp()
、compareAndSet()
等。 - 示例代码:
AtomicStampedReference<String> atomicStampedRef = new AtomicStampedReference<>("Initial Value", 0); int[] stampHolder = new int[1]; String value = atomicStampedRef.get(stampHolder); // 获取值和版本号 atomicStampedRef.compareAndSet(value, "New Value", stampHolder[0], stampHolder[0] + 1); // 原子更新 System.out.println(atomicStampedRef.getReference()); // 输出 "New Value"
- 在
AtomicMarkableReference<V>
:- 在
AtomicReference
的基础上增加了一个布尔标记(Mark),用于解决 ABA 问题。 - 常用方法:
getReference()
、isMarked()
、compareAndSet()
等。 - 示例代码:
AtomicMarkableReference<String> atomicMarkableRef = new AtomicMarkableReference<>("Initial Value", false); boolean[] markHolder = new boolean[1]; String value = atomicMarkableRef.get(markHolder); // 获取值和标记 atomicMarkableRef.compareAndSet(value, "New Value", markHolder[0], true); // 原子更新 System.out.println(atomicMarkableRef.getReference()); // 输出 "New Value"
- 在
3. 数组类型原子类
AtomicIntegerArray
:- 用于对
int
数组进行原子操作。 - 常用方法:
get()
、set()
、compareAndSet()
等。
- 用于对
AtomicLongArray
:- 用于对
long
数组进行原子操作。 - 常用方法与
AtomicIntegerArray
类似。
- 用于对
AtomicReferenceArray<E>
:- 用于对引用类型数组进行原子操作。
- 常用方法:
get()
、set()
、compareAndSet()
等。
4. 字段更新器
AtomicIntegerFieldUpdater<T>
:- 用于对类的
volatile int
字段进行原子更新。 - 常用方法:
get()
、set()
、compareAndSet()
等。 - 示例代码:
class Counter { volatile int count; } Counter counter = new Counter(); AtomicIntegerFieldUpdater<Counter> updater = AtomicIntegerFieldUpdater.newUpdater(Counter.class, "count"); updater.incrementAndGet(counter); // 原子递增 System.out.println(counter.count); // 输出 1
- 用于对类的
AtomicLongFieldUpdater<T>
:- 用于对类的
volatile long
字段进行原子更新。 - 常用方法与
AtomicIntegerFieldUpdater
类似。 - 示例代码:
class Counter { volatile long count; } Counter counter = new Counter(); AtomicLongFieldUpdater<Counter> updater = AtomicLongFieldUpdater.newUpdater(Counter.class, "count"); updater.addAndGet(counter, 10); // 原子增加 System.out.println(counter.count); // 输出 10
- 用于对类的
AtomicReferenceFieldUpdater<T, V>
:- 用于对类的
volatile
引用字段进行原子更新。 - 常用方法:
get()
、set()
、compareAndSet()
等。 - 示例代码:
class Container { volatile String value; } Container container = new Container(); AtomicReferenceFieldUpdater<Container, String> updater = AtomicReferenceFieldUpdater.newUpdater(Container.class, String.class, "value"); updater.compareAndSet(container, null, "New Value"); // 原子更新 System.out.println(container.value); // 输出 "New Value"
- 用于对类的
5. 总结
- 基本类型原子类:
AtomicInteger
、AtomicLong
、AtomicBoolean
,用于对基本类型进行原子操作。 - 引用类型原子类:
AtomicReference
、AtomicStampedReference
、AtomicMarkableReference
,用于对引用类型进行原子操作,并解决 ABA 问题。 - 数组类型原子类:
AtomicIntegerArray
、AtomicLongArray
、AtomicReferenceArray
,用于对数组进行原子操作。 - 字段更新器:
AtomicIntegerFieldUpdater
、AtomicLongFieldUpdater
、AtomicReferenceFieldUpdater
,用于对类的字段进行原子更新。
这些原子类通过 CAS 操作实现了高效的无锁并发控制,适合在高并发场景下使用。
THE END
暂无评论内容