Java - AtomicInteger 源码阅读笔记

in Tech Java

简介

  并发包下提供用于原子递增计数器等功能的工具类。因为是对单一变量的修改,因此内部使用CAS确保数据的准确性。总的来说只要熟悉UnSafe类,java.util.concurrent.atomic包下的实现类都比较容易理解。

AtomicInteger 类

public class AtomicInteger extends Number implements java.io.Serializable {
   ...
   // 存储值。使用了 volatile 关键字,能确保更新之后其他线程立马读到新值
   private volatile int value;
   private static final Unsafe unsafe = Unsafe.getUnsafe();
   // 偏移量
   private static final long valueOffset;

    static {
        try {
            // 初始化时确定value字段的偏移量
            valueOffset = unsafe.objectFieldOffset
                (AtomicInteger.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }
    ...
}

set() 方法

直接赋值,就完事了

    public final void set(int newValue) {
        value = newValue;
    }

get() 方法

直接获取,就完事了

    public final int get() {
        return value;
    }

getAndIncrement() 方法

    public final int getAndIncrement() {
        // 直接调用Unsafe类的getAndAddInt方法加1
        // 返回旧值
        return unsafe.getAndAddInt(this, valueOffset, 1);
    }

incrementAndGet() 方法

    public final int incrementAndGet() {
        // 与上面类似,不过返回的是旧值+1
        return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
    }

compareAndSet() 方法

    public final boolean compareAndSet(int expect, int update) {
        // 旧值等于expect,则更新为update
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

getAndUpdate() 方法

jdk1.8 提供的方法

    public final int getAndUpdate(IntUnaryOperator updateFunction) {
        int prev, next;
        do {
            // 旧值
            prev = get();
            // 通过自定义实现IntUnaryOperator接口的applyAsInt,返回新值
            next = updateFunction.applyAsInt(prev);
        } while (!compareAndSet(prev, next));// 替换为新值
        return prev;// 返回旧值
    }