ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AtomicStampedReference

2021-09-10 15:00:33  阅读:129  来源: 互联网

标签:reference stamp current int Pair AtomicStampedReference


AtomicInteger,AtomicBoolean,AtomicReference都是根据value的是否变化来做cas修改的,但是这样无法解决ABA的问题
AtomicStampedReference类不仅比较了对象还比较了版本号
AtomicStampedReference的使用

        Object obj = new Object();
        int initialStamp = 0;
        AtomicStampedReference atomicStampedReference = new AtomicStampedReference(obj,initialStamp);
        System.out.println(atomicStampedReference.getStamp());
        //修改对象的引用和版本号
        Object reference = atomicStampedReference.getReference();
        int stamp = atomicStampedReference.getStamp();
        atomicStampedReference.weakCompareAndSet(reference, new Object(), stamp, stamp + 1);
        System.out.println(atomicStampedReference.getStamp());

构造方法

    public AtomicStampedReference(V initialRef, int initialStamp) {
        pair = Pair.of(initialRef, initialStamp);
    }
	//Pair是AtomicStampedReference的内部类,它保存了一个持有的对象reference和版本号stamp
    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);
        }
    }

设置新对象

    public boolean weakCompareAndSet(V   expectedReference,
                                     V   newReference,
                                     int expectedStamp,
                                     int newStamp) {
        return compareAndSet(expectedReference, newReference,
                             expectedStamp, newStamp);
    }
    
    public boolean compareAndSet(V   expectedReference,
                                 V   newReference,
                                 int expectedStamp,
                                 int newStamp) {
        Pair<V> current = pair;
        return
        	//比较旧引用,当expectedReference != 对象当前的reference时,说明该数据肯定被其他线程修改过
            expectedReference == current.reference &&
            //比较旧版本,进一步比较expectedStamp是否等于对象当
前的版本号,以此判断数据是否被其他线程修改过
            expectedStamp == current.stamp &&
            //这里比较新引用和新版本,如果相等,则不需要修改了
            ((newReference == current.reference &&
              newStamp == current.stamp) ||
              //cas修改Pair
             casPair(current, Pair.of(newReference, newStamp)));

    private boolean casPair(Pair<V> cmp, Pair<V> val) {
    	//this:AtomicStampedReference
    	//pairOffset:pair的偏移量
    	//cmp:旧对象
    	//val:新对象
        return UNSAFE.compareAndSwapObject(this, pairOffset, cmp, val);
    }

标签:reference,stamp,current,int,Pair,AtomicStampedReference
来源: https://blog.csdn.net/weixin_41029286/article/details/120221465

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有