首页 > 其他分享 >CAS是什么

CAS是什么

时间:2023-06-22 21:55:50浏览次数:46  
标签:var5 var1 CAS 什么 修改 线程 内存

CAS又称 自旋锁、无锁,是一种乐观锁

img

img

  1. compare and swap 的缩写 意为: 比较并交换 , 实现并发算法的常用技术 , 就是说我不用加锁 , 也能保证 ( 加锁会影响效率,可以考虑使用原子操作类 ) 原子性 , 当多个线程尝试使用 CAS 同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试 , 因此可以知道 , CAS只会允许一个线程的执行成功
  2. CAS 包括三个操作数 - 内存位置 , 预期原值以及更新值
    1. 执行 CAS 操作的时候,将内存位置的值与预期原值比较
      1. 如果相匹配 , 那么处理器会自动的将该位置更新为新值
      2. 如果不匹配 , 处理器不做任何操作 , 多个线程同时执行 CAS 的操作只有一个成功

例如下面的 AtomicInteger 等 原子类 就是基于 CAS 实现的

操作的过程图解:

  1. CAS有三个操作数,位置内存值V , 旧的预期值A , 要修改的更新值B
  2. 当且仅当旧的预期值A 和内存值V相同时 , 将内存值V修改为B , 否则什么都不做或重来

img

img

img

AtomicInteger 执行过程源码:

AtomicInteger atomicInteger=new AtomicInteger();
    public void addAtomic(){
        atomicInteger.getAndIncrement();
    }
 
            // getAndIncrement方法 this是当前AtomicIntegr对象
            // valueOffset是内存偏移量/值
            // 1为自增量
            // Unsafe类的getAndAddInt方法,该Unsafe类是在jdk里的rt.jar包
 public final int getAndIncrement() {
        return unsafe.getAndAddInt(this, valueOffset, 1);
 }
 
 
 
  public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            //var1对象里的var2这个内存偏移量的值 
            var5 = this.getIntVolatile(var1, var2);         
            //var1 AtomicInteger 对象本身
            //var2 该对象值得引用地址,内存地址偏移量
            //var4 需要变动的数量 +1
            //var5 是用var1 var2 找出的主内存中真实的值
            //用该 对象当前的值与var5比较
            //如果相同,进行var5+var4并且返回true
            //如果不同,继续从主内存中取值然后 再比较,直到更新完成
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
        return var5;
    }

创建一个原子类对象 ( 默认初始化值为0 ) , 也可以传入定值 , 当我们使用CAS方法时 , 传入一个预期值 , 一个修改值 , 仅当预期值和当前对象 valueOffset的内存偏移量的值相同 , 就可以修改成功 , 前提是没有被其他的线程抢先一步进行比较并交换 , 否则就要继续读取最新的修改值 *( 变量可以使用 volatile关键字解决可见性问题 , 就是说 : 一个线程对共享变量的修改,能够及时的被其他线程看到 , 立刻同步最新数值 )* , 再继续的进行比较并交换这一操作 , 直到修改成功..... 这是比较并交换的源代码 : native为本地方法 , 底层用C 实现对操作系统的访问和操作 (Java不可以直接访问)

*此代码以及执行流程如下

标签:var5,var1,CAS,什么,修改,线程,内存
From: https://www.cnblogs.com/javaxubo/p/17498415.html

相关文章

  • 在finally中出现return会发生什么?
    目录看点:面试题:看点:当Java程序执行try块、catch块时遇到了return或throw语句,这两个语句都会导致该方法立即结束,但是系统执行这两个语句并不会结束该方法,而是去寻找该异常处理流程中是否包含finally块,如果没有finally块,程序立即执行return或throw语句,方法终止;如果有finally块,系......
  • MySQL中str_to_date函数和cast函数
    MySQL怎么将字符串转为datetime类型?两种转换方法:1、使用str_to_date()函数,可以格式化字符串,根据指定格式将其转为日期时间值,语法“str_to_date(字符串值,转换格式)”。2、使用CAST()函数,可以将指定字符串值转换为datetime数据类型,语法“CAST(字符串值ASdatetime)”。MySQLDAT......
  • java.lang.ClassCastException java.util.Date cannot be cast to java.sql.Date
    报错信息:java.lang.ClassCastException:java.util.Datecannotbecasttojava.sql.Date原因是:不要这样进行转换。具体转换看这里https://www.cnblogs.com/javaxubo/p/17498174.html......
  • 企业做seo的好处,为什么企业要做seo?
    如果您希望建立长期的品牌知名度、扩大目标受众并赚取更多收入,那么搜索引擎优化至关重要。让我们看看SEO为您的企业带来的10大好处,以及如何实现它们。1.它提高了你的可信度在搜索引擎结果页面上排名靠前的网站通常被搜索引擎认为是高质量和值得信赖的,而这反过来又会提高您的业......
  • 什么是因特网 笔记
    1.1什么是因特网1.1.1从具体构成因特网是全球性的且由多个计算机网络相互连接组成。计算机网络:由一条条的边将节点连接起来。节点:主机,端系统(主机=端系统)极其上面运行的网络程序。例:个人电脑(PC),电视,游戏机,家用电器等路由,交换机等数据交换设备。边:通信链路例:双绞......
  • 事件分发三连问:事件是如何从屏幕点击最终到达 Activity 的?CANCEL 事件什么时候会触发?
    一、题面试中提到安卓的事件分发,我们一般都能说到从Activity->Window->DecorView->ViewGroup->View的dispatchTouchEvent流程,这个是最基本的需要掌握的,由此能深入引出一些什么知识点呢?事件是如何从屏幕点击最终到达Activity的?CANCEL事件什么时候会触发?如何解决滑动......
  • AndroidUI进阶-为什么不能在子线程更新UI
    为什么不能在子线程更新UIandroid.view.ViewRootImpl$CalledFromWrongThreadException:Onlytheoriginalthreadthatcreatedaviewhierarchycantouchitsviews.atandroid.view.ViewRootImpl.checkThread(ViewRootImpl.java:8798)atandroid.view.ViewR......
  • 作为开发者,为什么你应该立即开始写技术博客
    现在短视频,视频,直播,自媒体平台泛滥的时代,很多人听到“博客”的时候,可能会想:现在还有人读博客?不管你怎么想,我还是要告诉你写技术博客对于开发者有多重要。而且必须是公开的技术博客,要和自己不公开的学习笔记区分开来。就从实际案例来说,很多业界大牛都在坚持写技术博客,比如前端CSS......
  • 【无标题】三段大厂实习经历,我学到了什么?
    大家好,我是Angus,来自一所普通一本院校的大四学生,普通且平凡,2021年,应该是我人生最跌宕起伏的一年,在农历2021年的最后一天,在除夕,我打算写下这篇文章,想给那些正在打算找实习或者正在实习的朋友,分享一下我的经历,希望能给大家带来一些鼓励和帮助,也在这里祝大家新年快乐,事事如意。三月时......
  • SBERT现在在业界中是什么地位,是否常用?有没有比SBERT更好的同类技术?
    作者:transformer链接:https://www.zhihu.com/question/507525712/answer/2280236067来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。   通过下面这张图可以看看SBERT在语义匹配这一块的地位(见红色标记部分):效果上,SBERT<<SBERT-flow≈SBERT-W......