原子类大多在包 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=x
getAndIncrement()
i++
getAndDecrement()
i--
getAndAdd()
i+=x
compareAndSet()
基础数据类型原子类
示例
AtomicInteger atomicInteger = new AtomicInteger(10);
atomicInteger.getAndIncrement();//相当于 i++
数组数据类型原子类
类似 基础数据类型原子类
引用类型原子类
AtomicReference
AtomicStamptReference
AtomicReference
增加了版本信息AtomicMarkableReference
AtomicReference
增加了修改标记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]