美文网首页
AtomicIntegerFieldUpdater

AtomicIntegerFieldUpdater

作者: 云师兄 | 来源:发表于2019-02-25 22:16 被阅读12次

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

相关文章

网友评论

      本文标题:AtomicIntegerFieldUpdater

      本文链接:https://www.haomeiwen.com/subject/xhinyqtx.html