在 Java 中,原子类是一组提供了原子性操作的类,可以在多线程环境中使用,保证了特定操作的原子性。这些类位于 java.util.concurrent.atomic
包中,主要包括以下几个常用的原子类:
1. AtomicInteger:
AtomicInteger
提供了对整数类型的原子操作。它的常见方法包括:
get
:获取当前值。set
:设置新值。getAndSet
:获取并设置新值。incrementAndGet
:原子性地增加 1。decrementAndGet
:原子性地减少 1。addAndGet
:原子性地增加指定的值。
importjava.util.concurrent.atomic.AtomicInteger; publicclassAtomicIntegerExample { publicstaticvoidmain(String[] args) { AtomicIntegeratomicInt=newAtomicInteger(0); intcurrentValue=atomicInt.get(); intnewValue=atomicInt.incrementAndGet(); System.out.println("Current value: "+currentValue); System.out.println("New value after increment: "+newValue); } }
2. AtomicLong:
AtomicLong
类似于 AtomicInteger
,但是针对长整型。它提供了类似的原子操作,用于对长整型数据进行原子操作。
3. AtomicBoolean:
AtomicBoolean
提供了对布尔类型的原子操作。它的主要方法包括:
get
:获取当前值。set
:设置新值。getAndSet
:获取并设置新值。compareAndSet
:比较并设置新值。weakCompareAndSet
:弱化版本的compareAndSet
,性能更好,但不保证同步语义。
importjava.util.concurrent.atomic.AtomicBoolean; publicclassAtomicBooleanExample { publicstaticvoidmain(String[] args) { AtomicBooleanatomicBoolean=newAtomicBoolean(true); booleancurrentValue=atomicBoolean.get(); atomicBoolean.set(false); System.out.println("Current value: "+currentValue); System.out.println("New value after set: "+atomicBoolean.get()); } }
4. AtomicReference:
AtomicReference
提供了对引用类型的原子操作。它的主要方法包括:
get
:获取当前值。set
:设置新值。getAndSet
:获取并设置新值。compareAndSet
:比较并设置新值。weakCompareAndSet
:弱化版本的compareAndSet
,性能更好,但不保证同步语义。
importjava.util.concurrent.atomic.AtomicReference; publicclassAtomicReferenceExample { staticclassData { Stringvalue; Data(Stringvalue) { this.value=value; } } publicstaticvoidmain(String[] args) { AtomicReference<Data>atomicReference=newAtomicReference<>(newData("Initial Value")); DatacurrentValue=atomicReference.get(); atomicReference.set(newData("New Value")); System.out.println("Current value: "+currentValue.value); System.out.println("New value after set: "+atomicReference.get().value); } }
5. AtomicStampedReference:
AtomicStampedReference
是对 AtomicReference
的增强,它引入了版本号(Stamp)的概念,用于解决 ABA 问题。ABA 问题指的是一个值原来是 A,后来被改成了 B,然后又被改回了 A,但是在整个过程中,可能有其他线程修改了这个值。AtomicStampedReference
在比较和设置时,除了比较引用本身外,还会比较版本号。
6. AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater:
这组类允许对指定类的指定字段进行原子更新。这些类的实例通常由工厂方法 newUpdater
创建,提供了对字段的原子更新方法,如 compareAndSet
。