Java - AtomicReference 源码阅读笔记

in Tech Java

简介

  同样顾名思义,提供对象引用类型的数据更新准确性保障。

AtomicReference类

public class AtomicReference<V> implements java.io.Serializable {
    private static final long serialVersionUID = -1848883965231344442L;

    private static final Unsafe unsafe = Unsafe.getUnsafe();
    // 对象偏移量
    private static final long valueOffset;

    static {
        try {
            // 初始化时确定value字段的偏移量
            valueOffset = unsafe.objectFieldOffset
                (AtomicReference.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }
    // 可见性保障
    private volatile V value;

构造方法

    public AtomicReference() {
    }
    public AtomicReference(V initialValue) {
        // 可以设置初始值
        value = initialValue;
    }

set() 方法

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

get() 方法

    public final V get() {
        return value;
    }

getAndSet() 方法

    public final V getAndSet(V newValue) {
        // 设置新值,并返回旧值
        return (V)unsafe.getAndSetObject(this, valueOffset, newValue);
    }

compareAndSet() 方法

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

getAndAccumulate() 方法

jdk1.8 提供的方法

    public final V getAndAccumulate(V x,BinaryOperator<V> accumulatorFunction) {
        V prev, next;
        do {
            prev = get();// 旧值
            // 通过自定义实现BinaryOperator接口的apply,返回新值
            next = accumulatorFunction.apply(prev, x);// 替换为新值
        } while (!compareAndSet(prev, next));
        return prev;// 返回旧值
    }