Java 原子类概述
Java 提供了一系列原子类,位于 java.util.concurrent.atomic 包中,用于在多线程环境下实现无锁的线程安全操作。这些类基于 CAS(Compare-And-Swap)机制,避免了传统锁的开销,适用于高并发场景。
基本类型原子类
AtomicBoolean
提供原子性的布尔值操作,如 compareAndSet、getAndSet 等。
AtomicBoolean flag = new AtomicBoolean(true);
flag.compareAndSet(true, false); // 原子更新
AtomicInteger
支持原子性的整型操作,如自增、加法等。
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet(); // 原子自增
AtomicLong
功能类似 AtomicInteger,但针对长整型数据。
AtomicLong counter = new AtomicLong(0L);
counter.addAndGet(10L); // 原子加法
引用类型原子类
AtomicReference
对普通对象引用进行原子操作。
AtomicReference<String> ref = new AtomicReference<>("initial");
ref.compareAndSet("initial", "updated");
AtomicStampedReference
解决 ABA 问题,通过版本号(Stamp)标记引用变化。
AtomicStampedReference<String> stampedRef =
new AtomicStampedReference<>("A", 0);
int[] stampHolder = new int[1];
String value = stampedRef.get(stampHolder); // 获取值和版本号
AtomicMarkableReference
类似 AtomicStampedReference,但用布尔标记代替版本号。
AtomicMarkableReference<String> markedRef =
new AtomicMarkableReference<>("data", false);
数组原子类
AtomicIntegerArray
原子操作整型数组中的元素。
AtomicIntegerArray array = new AtomicIntegerArray(10);
array.getAndIncrement(0); // 原子递增数组第0个元素
AtomicLongArray
类似 AtomicIntegerArray,但针对长整型数组。
AtomicLongArray longArray = new AtomicLongArray(10);
longArray.addAndGet(0, 100L);
AtomicReferenceArray
原子操作对象引用数组。
AtomicReferenceArray<String> refArray =
new AtomicReferenceArray<>(10);
refArray.set(0, "value");
字段更新原子类
AtomicIntegerFieldUpdater
基于反射原子更新类的整型字段。
class MyClass { volatile int value; }
AtomicIntegerFieldUpdater<MyClass> updater =
AtomicIntegerFieldUpdater.newUpdater(MyClass.class, "value");
MyClass obj = new MyClass();
updater.set(obj, 100);
AtomicLongFieldUpdater
类似 AtomicIntegerFieldUpdater,针对长整型字段。
AtomicLongFieldUpdater<MyClass> longUpdater =
AtomicLongFieldUpdater.newUpdater(MyClass.class, "longValue");
AtomicReferenceFieldUpdater
原子更新对象的引用类型字段。
AtomicReferenceFieldUpdater<MyClass, String> refUpdater =
AtomicReferenceFieldUpdater.newUpdater(MyClass.class, String.class, "field");
高性能累加器
LongAdder 与 DoubleAdder
适用于高并发统计场景,比 AtomicLong 更高性能。
LongAdder adder = new LongAdder();
adder.add(10);
long sum = adder.sum();
LongAccumulator 与 DoubleAccumulator
支持自定义累加规则(如取最大值)。
LongAccumulator accumulator = new LongAccumulator(Long::max, 0L);
accumulator.accumulate(100); // 保留最大值
使用场景建议
- 计数器场景:优先使用
LongAdder替代AtomicLong。 - 对象引用更新:需解决 ABA 问题时选择
AtomicStampedReference。 - 字段原子更新:使用
AtomicXXXFieldUpdater减少内存占用。
通过合理选择原子类,可以显著提升并发程序的性能和可靠性。
8524



被折叠的 条评论
为什么被折叠?



