Java - AtomicStampedReference 源码阅读笔记

in Tech Java

简介

  AtomicStampedReference与AtomicReference的区别就是多了一个整数“标记”。换句话说就是,增加了版本号,可有效避免ABA问题。

AtomicStampedReference类

public class AtomicStampedReference<V> {

    private static class Pair<T> {
        // 对象引用
        final T reference;
        // 版本号
        final int stamp;
        private Pair(T reference, int stamp) {
            this.reference = reference;
            this.stamp = stamp;
        }
        // 存储新的对象及版本号
        static <T> Pair<T> of(T reference, int stamp) {
            return new Pair<T>(reference, stamp);
        }
    }

    private volatile Pair<V> pair;
}

构造方法

    // 必须指定初始化对象,初始化版本号
    public AtomicStampedReference(V initialRef, int initialStamp) {
        pair = Pair.of(initialRef, initialStamp);
    }

set() 方法

    public void set(V newReference, int newStamp) {
        Pair<V> current = pair;
        // 对象引用地址不相等或版本号不相等,则更新
        if (newReference != current.reference || newStamp != current.stamp)
            this.pair = Pair.of(newReference, newStamp);
    }

get() 方法

    public V get(int[] stampHolder) {
        Pair<V> pair = this.pair;
        // stampHolder存储版本号
        stampHolder[0] = pair.stamp;
        // 返回最新对象
        return pair.reference;
    }

getReference() 方法

    public V getReference() {
        return pair.reference;
    }