Jdk1.6 JUC源码解析(4)-atomic-AtomicStampedReference、AtomicMarkableReference

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

 

    原文作者:JUC
    原文地址: https://blog.csdn.net/iteye_11160/article/details/82642193
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞