`
BrokenDreams
  • 浏览: 249056 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
68ec41aa-0ce6-3f83-961b-5aa541d59e48
Java并发包源码解析
浏览量:97973
社区版块
存档分类
最新评论

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics