CAS之AtomicReference原理解析

这篇具有很好参考价值的文章主要介绍了CAS之AtomicReference原理解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如果你了解了AtomicInteger的工作原理,或者看了如下文章,知道了AtomicInteger只能对当个int类型共享变量做cas的缺点。

CAS之AtomicInteger原理解析_z275598733的博客-CSDN博客

那么AtomicReference就是来解决这个问题的。原理很类似,只是AtomicReference是对对象做cas操作。从一段AtomicReference类的方法调用代码开始来对源码做分析

public class Test {

    public static void main(String[] args) {
        A a1 = new A(0, 0l);
        A a2 = new A(1, 1l);
        AtomicReference<A> ar = new AtomicReference<>(a1);
        ar.getAndSet(a2);
        System.out.println(ar.get().toString());
        
        //打印对象ai的内存结构,需要引入jol-core工具包
        ClassLayout classLayout = ClassLayout.parseInstance(ar);
        System.out.println(classLayout.toPrintable());
    }
}

@Getter
@Setter
@AllArgsConstructor
@ToString
class A{
    private int v1;
    private double v2;
}

从 new AtomicReference<>(a1)进入先看静态代码块和构造方法,再看 ar.getAndSet(a2) 做了什么。

public class AtomicReference<V> implements java.io.Serializable {
    ...

    static {
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicReference.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }

    //与AtomicInterger类基本一致,只不过类型由int变成了泛型V
    private volatile V value;

    
    public AtomicReference(V initialValue) {
        value = initialValue;
    }

    //与对象
    public final boolean compareAndSet(V expect, V update) {
        //this-当前AtomicReference对象;valueoffest-相对AtomicReference的内存偏移量;
        expect
        return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
    }

    //具体实现,需要进入到Unsafe类中
    public final V getAndSet(V newValue) {
        this-当前AtomicReference对象;valueoffest-相对this对象的内存偏移量;newValue-新对象
        return (V)unsafe.getAndSetObject(this, valueOffset, newValue);
    }

    ...
}

 进入到Unsafe.getAndSetObject方法中

public final class Unsafe {
    ...

    public final Object getAndSetObject(Object var1, long var2, Object var4) {
        Object var5;
        do {
            //通过对象中value相对偏移量获取内存中的value对象,这里var5对其他线程是可见的, 如果不可见,那么这个值的获取就可能非内存真实值。与Unsafe.getAndAddInt异曲同工
            var5 = this.getObjectVolatile(var1, var2);

            //compareAndSwapObject的过程是原子性的,将重新获取到的内存对象value与var5比较,true则说明对象value并未被修改,可以将原对象改成var4。区别于Unsafe.compareAndSwapInt, 这里比较对象
        } while(!this.compareAndSwapObject(var1, var2, var5, var4));

        return var5;
    }

    //native方法,暂不深究
    public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);
    ...
}


 以下是debug的信息

CAS之AtomicReference原理解析,restful,后端

 AtomicReference类对象ar的内存结构

CAS之AtomicReference原理解析,restful,后端

 总而言之,AtomicReference可以保证对象的修改是线程安全的,AtomicReference对比AtomicInteger 可以在共享对象内部维护多个共享变量,但是ABA问题依然没有解决。文章来源地址https://www.toymoban.com/news/detail-633982.html

到了这里,关于CAS之AtomicReference原理解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 「JUC并发编程」初识CAS锁(概述、底层原理、原子引用、自旋锁、缺点)

    概述 CAS的全称为 Compare-And-Swap ,直译就是 对比交换 。是一条 CPU的原子指令 ,其作用是让CPU 先 进行比较两个值是否相等, 然后 原子地更新某个位置的值。经过调查发现,其实现方式是 基于硬件平台的汇编指令 ,就是说CAS是靠硬件实现的, JVM只是封装了汇编调 用,那些

    2024年02月16日
    浏览(45)
  • 【JavaEE初阶】多线程进阶(五)常见锁策略 CAS synchronized优化原理

    乐观锁:预测锁竞争不是很激烈。 悲观锁:预测锁竞争会很激烈。 以上定义并不是绝对的,具体看预测锁竞争激烈程度的结论。 轻量级锁加锁解锁开销比较小,效率更高。 重量级锁加锁解锁开销比较大,效率更低。 多数情况下,乐观锁也是一个轻量级锁。 多数情况下,悲

    2024年02月03日
    浏览(39)
  • 【CAS6.6源码解析】源码构建时-默认service配置不生效解决方案

    CAS6的源码提供了默认的HTTPSandIMAPS-10000001.json配置用于授权所有的https和imaps服务,但是当添加JsonServiceRegistry模块启动后,会发现service是没有被注册的,是由于json路径引起的错误,可以把路径修改为绝对路径以解决此问题。 CAS默认采用json的方式去文件中读取服务的定义从而注

    2024年02月15日
    浏览(44)
  • SpringMVC原理分析 | Controller配置、RestFul风格

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 控制器Controller 控制器复杂提供访问应用程序的行为,通常通过 接口定义 或 注释定义 的两种方法实现 控制器负责解析用户的请求并将其转换为一个模型 SpringMVC中一个控制器可以包含多个方法 实现Controller接口 Contro

    2024年02月11日
    浏览(33)
  • Rest_Framework由浅入深:从CBV到ModelViewSet源码一步步解析

    1、Django Rest_Framework介绍 Django REST framework 是一个建立在 Django 基础之上的 Web 应用开发框架,可以快速的开发 REST API 接口应用。在 REST framework 中,提供了序列化器 Serialzier 的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集

    2024年02月06日
    浏览(39)
  • (02)Cartographer源码无死角解析-(75) 2D后端优化→整体复盘,理解后端优化核心

    讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885   文末正下方中心提供了本人 联系方式, 点击本人照片

    2024年02月13日
    浏览(37)
  • 前端传递JSON数组数据到后端(解析方法)

            在前端和后端之间 传递数组 时,由于HTTP协议的限制,无法直接传递数组类型的参数。 请求参数需要被转换为字符串格式传递给后端,所以需要通过 JSON.stringify() 方法将 gradeIdArray 数组转换为一个 JSON 字符串,并将其作为参数传递给后端。         在后端的控

    2024年02月16日
    浏览(43)
  • FastJson在Java后端方面解析使用(二)

    ​ JSON现在常用来做前后端数据交互,两个蝴蝶飞只是简单的对JSON做一下讲解和简单使用。关于JSON,我还了解的远远不够。由于本人经验有限,嘴皮子不溜,所以学术性,概念性,底层性的知识点暂时不做介绍。文章中有错误之处,欢迎拍砖和指点。在此,特别向阿里团队表

    2024年02月12日
    浏览(27)
  • [JavaWeb]【五】web后端开发-Tomcat && SpringBoot解析

    目录 一 介绍Tomcat  二 基本使用 2.1 解压绿色版 2.2 启动TOMCAT 2.3 关闭TOMCAT 2.4 常见问题  2.5 修改端口号  2.6 部署应用程序 三 SpringBootWeb入门程序解析 前言:tomcat与SpringBoot解析                            

    2024年02月12日
    浏览(30)
  • springboot-简单测试 前端上传Excel表格后端解析数据

    后端返回数据

    2024年01月20日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包