AtomicIntegerFieldUpdater
1. 引子
在之前的學(xué)習(xí)中我們認識了AtomicInteger和AtomicReference芦昔,以及它們底層的實現(xiàn)——CAS娃肿。今天要學(xué)習(xí)的是AtomicIntegerFieldUpdater,它實現(xiàn)了可以線程安全地更新對象中的整型變量料扰。
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);
}
上述示例最終輸出結(jié)果為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());
}
}
}
上述示例中捆憎,創(chuàng)建AtomicIntegerFieldUpdater對象的時候要指定對象的類和要更新類中的哪個字段,此處要更新的是ConcurrencyTest類中的count字段致份。
一開始初始值為100础拨,所以第一次CAS操作時滿足要求,將值更新為120诡宗;第二次當前對象中的字段值已經(jīng)為120,所以和100比較不相等塔沃,所以比較失敗,進入else中螃概,所以最終輸出如下:
update success 120
update fail 120