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

本文介绍了Java并发编程中解决ABA问题的AtomicStampedReference和AtomicMarkableReference。AtomicStampedReference是一个带版本号的原子引用,用于避免ABA问题,而AtomicMarkableReference则适用于表示如已删除的节点状态。文章详细讨论了这两个类的内部结构和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值