AtomicIntegerFieldUpdater
1. 引子
在之前的学习中我们认识了AtomicInteger和AtomicReference,以及它们底层的实现——CAS。今天要学习的是AtomicIntegerFieldUpdater,它实现了可以线程安全地更新对象中的整型变量。
2. AtomicReference的CAS示例
示例如下:
public static AtomicReference<Integer> atomicReference = new AtomicReference<>(0);
public static void main(String[] args) throws InterruptedException {
atomicReference.compareAndSet(0,2); // 如果当前值为0,将其更新为2
atomicReference.compareAndSet(0,1); // 如果当前值为0,将其改为1
atomicReference.compareAndSet(1,3); // 如果当前值为1,将其改为3
atomicReference.compareAndSet(2,4); // 如果当前值为2,将其改为4
atomicReference.compareAndSet(3,5); // 如果当前值为3,将其改为5
System.out.println("atomicReference="+atomicReference);
}
上述示例最终输出结果为4,CAS的原理即Compare and Set两个操作。
3. AtomicIntegerFieldUpdater的CAS示例
示例如下:
public class ConcurrencyTest {
public static AtomicIntegerFieldUpdater<ConcurrencyTest> updater = AtomicIntegerFieldUpdater.newUpdater(ConcurrencyTest.class,"count");
private volatile int count = 100;
public int getCount(){
return count;
}
private static ConcurrencyTest concurrencyTest = new ConcurrencyTest();
public static void main(String[] args) throws InterruptedException {
if(updater.compareAndSet(concurrencyTest,100,120)){
System.out.println("update success "+concurrencyTest.getCount());
}
if(updater.compareAndSet(concurrencyTest,100,130)){
System.out.println("update success "+concurrencyTest.getCount());
} else {
System.out.println("update fail "+concurrencyTest.getCount());
}
}
}
上述示例中,创建AtomicIntegerFieldUpdater对象的时候要指定对象的类和要更新类中的哪个字段,此处要更新的是ConcurrencyTest类中的count字段。
一开始初始值为100,所以第一次CAS操作时满足要求,将值更新为120;第二次当前对象中的字段值已经为120,所以和100比较不相等,所以比较失败,进入else中,所以最终输出如下:
update success 120
update fail 120