Jdk1.6 JUC源码解析(4)-atomic-AtomicStampedReference、AtomicMarkableReference
作者:大飞
功能简介:
- 为了避免CAS过程中的ABA问题,并发包提供了两个类,AtomicStampedReference和AtomicMarkableReference。前者相当于一个[引用,integer]的二元组,后者相当于一个[引用,boolean]的二元组。
- AtomicStampedReference可用来作为带版本号的原子引用,而AtomicMarkableReference可用于表示如:已删除的节点。
注:ABA问题是指在CAS操作过程中,假设我们想要把目标值由1改为2,一般过程是检测目标值是否为1,如果为1就将其设置为2。但可能在检测之前目标值变成了3,然后又变成了1,检测过程并不能察觉到这种变化。这一般不会有什么影响,但在某些情况下也可能会是一个问题。
源码分析:
- 首先看一下AtomicStampedReference的内部结构。
public class AtomicStampedReference<V> { private static class ReferenceIntegerPair<T> { private final T reference; private final int integer; ReferenceIntegerPair(T r, int i) { reference = r; integer = i; } } private final AtomicReference<ReferenceIntegerPair<V>> atomicRef; /** * Creates a new {@code AtomicStampedReference} with the given * initial values. * * @param initialRef the initial reference * @param initialStamp the initial stamp */ public AtomicStampedReference(V initialRef, int initialStamp) { atomicRef = new AtomicReference<ReferenceIntegerPair<V>> (new ReferenceIntegerPair<V>(initialRef, initialStamp)); }可见,AtomicStampedReference内部是一个ReferenceIntegerPair引用(元组),然后使用一个AtomicReference来对这个引用进行原子更新。
AtomicMarkableReference中也是类似的结构。
public class AtomicMarkableReference<V> { private static class ReferenceBooleanPair<T> { private final T reference; private final boolean bit; ReferenceBooleanPair(T r, boolean i) { reference = r; bit = i; } } private final AtomicReference<ReferenceBooleanPair<V>> atomicRef; /** * Creates a new {@code AtomicMarkableReference} with the given * initial values. * * @param initialRef the initial reference * @param initialMark the initial mark */ public AtomicMarkableReference(V initialRef, boolean initialMark) { atomicRef = new AtomicReference<ReferenceBooleanPair<V>> (new ReferenceBooleanPair<V>(initialRef, initialMark)); }
其他代码比较容易看懂,这里不做具体分析。
源码就分析到这里!
参见:Jdk1.6 JUC源码解析(1)-atomic-AtomicXXX