首页 > 其他分享 >CAS简介

CAS简介

时间:2023-06-12 16:32:42浏览次数:30  
标签:Thread CAS 简介 num 线程 new public



文章目录

  • 前言
  • 一、锁? CAS?
  • 二、juc--java.util.concurrent
  • 1.CAS思想的落地
  • 2 ABA问题出现
  • 3 可以解决的问题
  • 4 缺点
  • 总结



前言

CAS的全称是:比较并交换(Compare And Swap)。在CAS中,有这样三个值:

V:要更新的变量(var)
E:预期值(expected)
N:新值(new)
比较并交换的过程如下:

判断V是否等于E,如果等于,将V的值设置为N;如果不等,说明已经有其它线程更新了V,则当前线程放弃更新,什么都不做。

所以这里的预期值E本质上指的是“旧值”


一、锁? CAS?

CAS 相当于一个乐观锁,比较后,根据比较结果,赋值;
常见的乐观锁使用场景: 数据库

二、juc–java.util.concurrent

1.CAS思想的落地

CAS简介_开发语言

2 ABA问题出现

所谓ABA问题,就是一个值原来是A,变成了B,又变回了A。这个时候使用CAS是检查不出变化的,但实际上却被更新了两次

通过版本号,或者时间戳来解决 AtomicStampedReference

3 可以解决的问题

我们之前计算的时候,用基本类型作为计算,不加锁的时候,会导致计算结果错误,当用了上述的CAS类之后,再做计算就不会有问题了,

@Data
public class 多线程问题 implements Runnable {

    //public static int num = 0;
    //private synchronized void add() {
    //    for (int i = 0; i < 500; i++) {
    //        num++;
    //    }
    //}
    //public volatile int num = 0;
    AtomicInteger num = new AtomicInteger(0);
    private void add() {
        for (int i = 0; i < 500; i++) {
            num.getAndIncrement();
            //num++;
        }
    }

    @Override
    public void run() {
        add();
    }

    public static void main(String[] args) {


        for (int i = 0; i < 1000; i++) {
            多线程问题 pro = new 多线程问题();

            Thread thread = new Thread(pro);
            thread.setName("第一个线程");

            Thread thread1 = new Thread(pro);
            thread1.setName("第二个线程");

            thread1.start();
            thread.start();
            while (Thread.activeCount() > 1) {
                Thread.yield();
            }
            System.out.println(pro.num.get());
            //System.out.println(pro.getNum());
        }
    }
}

4 缺点

当CAS失败后,通常是抛出异常或者自旋来解决,那么如果一直失败,自旋的方式就会给cpu造成非常大的开销;


总结

CAS是一个理论,理论的核心就是我要修改的值,是不是没有被其他线程修改过,判断为true,那么我不应该修改,判断为flase 那么我可以对其进行修改;


标签:Thread,CAS,简介,num,线程,new,public
From: https://blog.51cto.com/u_16158506/6463460

相关文章

  • 计算机网络协议简介(二)
    一、网络协议的概念网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。网络协议是由语法、语义、时序三个要素组成,语义表示要做什么,语法表示要怎么做,时序表示做的顺序。语义:解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做......
  • Android自动化随机测试工具-Monkey简介
    Monkey简介Monkey的名字是有何而来的呢?这个没有去怎么考究,Monkey这个工具就是一个调皮的猴子,在App中乱按、乱摸、乱滚、乱跳。Monkey测试是Android平台下自动化测试的一种快速有效的手段,通过Monkey工具可以模拟用户触摸屏幕、滑动轨迹球、按键等操作来对模拟器或者手机设......
  • MySQL闪回工具简介 及 binlog2sql工具用法
    一、闪回工具简介1.工具分类第一类以patch形式集成到官方工具mysqlbinlog中优点上手成本低。mysqlbinlog原有的选项都能直接利用,只是多加了一个闪回选项,未来有可能被官方收录。支持离线解析。缺点兼容性差、项目活跃度不高。难以添加新功能,实战效果欠佳。安装麻烦。需要对m......
  • TCP/IP 协议简介
    一图看完本文一、计算机网络体系结构分层计算机网络体系结构分层计算机网络体系结构分层不难看出,TCP/IP与OSI在分层模块上稍有区别。OSI参考模型注重“通信协议必要的功能是什么”,而TCP/IP则更强调“在计算机上实现协议应该开发哪种程序”。二、TCP/IP基础1.TCP/IP的具......
  • SQL简介-通用语法-分类
       ......
  • 物联网开源操作系统简介
    物联网、开源、操作系统是目前IT业界的热门词汇,也正是这三个词汇构成了物联网开源操作系统。那么,对于物联网开源操作系统,你了解有多少呢?我们今天带大家一起走近物联网操作系统,同时介绍10款经典的物联网操作系统。从物联网说起物联网,英文名:InternetofThings,简称:IoT,是互......
  • Xilinx GTH 简介 ,CoaXpress FPGA PHY 部分
    什么是GTHGTH是XilinxUltraScale系列FPGA上高速收发器的一种类型,本质上和其它名称如GTP,GTX等只是器件类型不同、速率有差异;GTH最低速率在500Mbps,最高在16GbpsCoaXpressHost/DeviceIP均需要用到厂商的GT收发器模块,因此这里写一篇笔记作为开发记录GTH的特性physicalc......
  • BouncyCastle
    在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务参考附件内容完成SM2加解密的内容,提交运行结果截图(10‘)2完成SM3,SM4算法的调用,提交运行结果截图和代码(15’,选做)BouncyCastle配置1.jar包下载官网:https://www.bouncycastle.org/latest_releases.htmlbcprov-e......
  • TI LFA FRR和 AnyCast FRR
          ......
  • 常见漏洞简介 防御建议
    BurtForce(暴力破解漏洞)概述:连续性尝试+字典+自动化(攻击者在不知道目标账号和密码的情况下进行尝试性的登录,在这个尝试的过程中,会使用一些自动化的工具和一个特定的字典,比如一个账号密码库,实现一个高效的自动化的连续的尝试性登录,从而得到一些有效的账户和密码)字典:一个有效的......