原子类大多在包 java.util.concurrent.atomic 下
| 原子型 | 基础型 | 类型 | 说明 |
|---|---|---|---|
| AtomicBoolean | boolean | 基本 | |
| AtomicInteger | int | 基本 | |
| AtomicIntegerArray | int[] | 数组 | |
| AtomicIntegerFieldUpdater | |||
| AtomicLong | long | 基本 | |
| AtomicLongArray | long[] | 数组 | |
| AtomicLongFieldUpdater | |||
| AtomicMarkableReference | |||
| AtomicReference | Object | 引用 | |
| AtomicReferenceArray | Object[] | 数组 | |
| AtomicReferenceFieldUpdater | |||
| AtomicStampedReference | |||
| DoubleAccumulator | |||
| DoubleAdder | |||
| LongAccumulator | |||
| LongAdder |
通用 api
get()getAndSet()i=xgetAndIncrement()i++getAndDecrement()i--getAndAdd()i+=xcompareAndSet()基础数据类型原子类
示例
AtomicInteger atomicInteger = new AtomicInteger(10);
atomicInteger.getAndIncrement();//相当于 i++
数组数据类型原子类
类似 基础数据类型原子类
引用类型原子类
AtomicReferenceAtomicStamptReferenceAtomicReference 增加了版本信息AtomicMarkableReferenceAtomicReference 增加了修改标记isMarked()compareAndSet(old, new, oldMark, !oldMark)AtomicStamptReference 只关心是否被改过,而不关心更改次数注意
引用类型原子类只能 CAS 引用本身,而不是引用内部的字段值
User user = new User();
AtomicReference<User> atomicUser = new AtomicReference<>();
atomicUser.set(user);
atomicUser.compareAndSet(user,new User());
public volatile 修饰包含下面三个类
AtomicIntegerFieldUpdater<User> updater =
AtomicIntegerFieldUpdater.newUpdater(User.class,"age");
updater.getAndIncrement(user);
应用场景
适用于不要求实时精确,的基础数据累加
与 AtomicLong 比较
LongAdder 和 LongAccumulator 的区别
| 初始值 | 加值 | |
|---|---|---|
LongAdder | 只能是 0 | 只能是 1 |
LongAccumulator | 任意 | 任意 |
LongAdder adder = new LongAdder();
adder.increment();
adder.increment();
System.out.println(adder.sum()); // 2
LongAccumulator accumulator = new LongAccumulator((x,y)->x+y,0);
accumulator.accumulate(1);
accumulator.accumulate(2);
System.out.println(accumulator.get()); // 3
源码
详见 基础 | 并发编程 - [Striped64]