JUC 并发包 中也提供了三个原子应用类型的操作类:
- AtomicReference
- AtomicMarkableReference
- AtomicStampedReference
有时候原子操作不一定是基本数据类型,而是 BigDecimal 类型,所以需要用到这些类。
AtomicReference 在声明的时候需要指定一个泛型 AtomicReference<BigDecimal>
,和 AtomicInteger 是方式不一样,底层调用的是 Unsafe#compareAndSwapObject
方法。
下面是一个使用例子:
// DecimalAccount 是一个自定义接口,只有 getBalance 和 withdraw 抽象方法。
class DecimalAccountSafeCas implements DecimalAccount {
AtomicReference<BigDecimal> ref;
public DecimalAccountSafeCas(BigDecimal balance) {
ref = new AtomicReference<>(balance);
}
@Override
public BigDecimal getBalance() {
return ref.get();
}
@Override
public void withdraw(BigDecimal amount) {
while (true) {
BigDecimal prev = ref.get();
BigDecimal next = prev.subtract(amount);
if (ref.compareAndSet(prev, next)) {
break;
}
}
}
}
AtomicReference 就是修改引用所指向的对象实例。