详解CAS

news2024/9/21 22:22:38

CAS

全称compare and swap,字面意思"比较和交换"
能够比较和交换某个寄存器中的值和内存中的值,看是否相等,如果相等,则把另外一个寄存器中的值和内存中的值进行交换

伪代码

在这里插入图片描述
这个就给我们编写线程安全代码,打开了新世界的大门,基于CAS又能衍生出一套"无锁编程",但是CAS的使用范围具有一定的局限性

CAS的应用场景

实现原子类

比如,多线程针对一个count变量进行++操作,在java标准库中,已经有了一组原子类
在这里插入图片描述
在这里插入图片描述
上述类提供了自增/自减/自增任意值/自减任意值这些操作,就可以基于CAS按照无锁编程的方式来实现
实例代码:

package Thread;

import java.util.concurrent.atomic.AtomicInteger;

public class demo1 {
    private static AtomicInteger count = new AtomicInteger(0);
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(()->{
            for (int i= 0;i<5000;i++){
                //count++;
                count.getAndIncrement();
                //++count
                //count.incrementAndGet();
                //count--;
                //count.getAndDecrement();
                //--count;
                //count.decrementAndGet();
            }
        });
        Thread t2 = new Thread(()->{
           for (int i = 0;i<5000;i++){
               count.getAndIncrement();
           }
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(count.get());
    }
}


在这里插入图片描述
上述的原子类就是基于CAS实现的
伪代码示例:
在这里插入图片描述
CAS本身是一个单个的指令,这里其实包含了访问内存的操作,当多个cpu尝试同时访问内存的时候,本质上也是会出现先后顺序的
当两个CAS同时访问内存的时候,一定有一个线程的CAS先访问到,另一个后访问到内存的,初始情况下,value是0,然后oldvalue也是零,第一个线程,此时拿到value就是0,会判定成CAS成立,同时更新value为1,第二个线程再进行CAS访问内存,读出来的value就已经是1了,这时候,就会出现value与oldvalue的值是不一样的,就会对old重新赋值
为什么CAS访问内存会有先后呢,这是因为多个CPU在操作同一个资源时,也会涉及到锁竞争(比synchronized代码级别的锁要轻量一些)

实现自旋锁

基于CAS实现更灵活的锁,获取更多的控制权
伪代码:

public class SpinLock {
        private Thread owner = null;
        public void lock(){
        // 通过 CAS 看当前锁是否被某个线程持有.
        // 如果这个锁已经被别的线程持有, 那么就自旋等待.
        // 如果这个锁没有被别的线程持有, 那么就把 owner 设为当前尝试加锁的线程.
        while(!CAS(this.owner, null, Thread.currentThread())){
                
        }
}
        public void unlock (){
            this.owner = null;
        }
}

CAS的ABA问题

CAS的关键要点,是比较寄存器1和内存的值,通过这里的是否相等,来判定内存的值,是否发生了变化,如果内存的值变了,存在其他线程进行了修改,
如果内存的值没变,没有别的线程修改,接下来进行的修改就是安全的.
但是,如果这里的值没变,就一定是没有别的线程修改吗?
A-B-A
另一个线程,把变量的值从A->B,又从B->A.此时本线程区分不了,这个值是始终没变,还是变了又改回来了的情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/931989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

权限提升-数据库权限到web权限+后台权限到web权限

权限提升基础信息 1、具体有哪些权限需要我们了解掌握的&#xff1f; 后台权限&#xff0c;网站权限&#xff0c;数据库权限&#xff0c;接口权限&#xff0c;系统权限&#xff0c;域控权限等 2、以上常见权限获取方法简要归类说明&#xff1f; 后台权限&#xff1a;SQL注入,数…

本地镜像管理

查看 用户可以通过docker images命令查看本地所有镜像&#xff0c;如下&#xff1a; 这里一共有五个参数&#xff0c;含义分别如下&#xff1a; REPOSITORY 仓库名称&#xff0c;仓库一般用来存放同一类型的镜像。仓库的名称由其创建者指定。如果没有指定则为<none>。…

学生宿舍人走自动断电设备的功能要求

学生宿舍人走自动断电系统石家庄光大远通电气有限公司断电系统由人员探测模块&#xff08;安装在房间内部&#xff09;宿舍用电控制模块&#xff08;安装在房间供电线路&#xff09;&#xff0c;智能数据网关及后台服务器组成&#xff0c;每个房间安装一台探测器&#xff0c;实…

高并发编程-3. Amdahl(阿姆达尔)定律与Gustafson定律

此文章为笔记&#xff0c;为阅读其他文章的感受、补充、记录、练习、汇总&#xff0c;非原创&#xff0c;感谢每个知识分享者。 前言 有关为什么要使用并行程序的问题前面已经进行了简单的探讨。总的来说&#xff0c;最重要的应该是处于两个目的。 第一&#xff0c;为了获得更…

SpringBoot+mybatis+pgsql多个数据源配置

一、配置文件 jdk环境&#xff1a;1.8 配置了双数据源springbootdruidpgsql&#xff0c;application.properties配置修改如下&#xff1a; #当前入库主数据库 spring.primary.datasource.typecom.alibaba.druid.pool.DruidDataSource spring.primary.datasource.driver-class…

太阳能光伏产业链特征

从太阳能光伏产业链上来看&#xff0c;上游产业是原材料的生产环节&#xff0c;主要是对硅矿石和高纯度硅料的开采、提炼和生产&#xff0c;如冶金硅提纯、多晶硅提纯、单晶/多晶硅片加工与切割等环节。此外还包括太阳能电背板、电池用玻璃等系统配件的制造。 中游产业是技术核…

Day979.OAuth2.0可能存在的安全问题 -OAuth 2.0

OAuth2.0可能存在的安全问题 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于OAuth2.0可能存在的安全问题的内容。 “OAuth 2.0 不是一种安全协议吗&#xff0c;不是保护 Web API 的吗&#xff1f;为啥 OAuth 2.0 自己还有安全的问题了呢&#xff1f;” 首先&#x…

积跬步至千里 || 数学基础、算法与编程

数学基础、算法与编程 1. BAP 技能 BAP 技能是指基础(Basic)、算法(Algorithm)和编程(Programm)三种基本技能的深度融合。理工科以数学、算法与编程为根基&#xff0c;这三个相辅相成又各有区别。 &#xff08;1&#xff09;数学以线性代数为主要研究工具和部分微积分技术为手…

Spring boot 集成单元测试

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency> 2. 3.编写测试类 package com.enterprise;import com.enterpr…

网络安全02-C段扫描、开放端口

查询网站IP https://seo.chinaz.com/hetianlab.com 扫描指定IP&#xff1a;例&#xff1a;nmap -A -T4 ww.hetianlab.com -oX out.html 扫描指定段&#xff1a;例&#xff1a;nmap -O -Pn -A 192.168.113.1-200 扫描整个C段&#xff1a;例&#xff1a;nmap -O -Pn -A 192.168.…

ChatGPT在医疗系统的应用探索动态

注意&#xff1a;本信息仅供参考&#xff0c;发布该内容旨在传递更多信息的目的&#xff0c;并不意味着赞同其观点或证实其说法。 生成式人工智能&#xff0c;如OpenAI开发的ChatGPT&#xff0c;被认为是可以颠覆医疗行业的工具。尽管该技术刚刚起步&#xff0c;但已有许多医…

python 面试题--2(15题)

目录 1.解释Python中的 GIL&#xff08;全局解释器锁&#xff09;是什么&#xff0c;它对多线程编程有什么影响&#xff1f; 2.Python中的装饰器是什么&#xff1f;如何使用装饰器&#xff1f; 3.解释Python中的迭代器和生成器的区别。 4.什么是Python中的列表解析&#xf…

redis报错WRONGTYPE Operation against a key holding the wrong kind of value

在redis中我们一般存储string、list、hash类型的值&#xff0c;对应的方法分别为 db.StringGet(“key”)、db.ListRange、db.HashGetAll 如果取list类型值时使用了string的方法就会报WRONGTYPE Operation against a key holding the wrong kind of value错误。 redis-cli命令窗…

网络安全之红蓝对抗实战

前言 背景介绍&#xff1a;目标是拿到企业www.xxx.com的《上市商业计划书.docx》&#xff0c;通过 OPENVPN 访问。特别提出的得分规则修改&#xff0c;权限的得分必须有 WEBSHELL/交互式 SHELL&#xff0c;只有一个漏洞回显不给分&#xff0c;更加偏向考察**漏洞利用**而非漏洞…

简单shell脚本的编写

shell脚本就是将命令写入文本中&#xff0c;文本可以被执行。 脚本&#xff1a;本质是一个文件&#xff0c;文件里面存放的是 特定格式的指令&#xff0c;系统可以使用脚本解析器 翻译或解析 指令 并执行&#xff08;它不需要编译&#xff09; shell 既是应用程序&#xff0c…

小研究 - Java虚拟机垃圾收集器的性能分析与调节

垃圾收集器是&#xff2a;&#xff41;&#xff56;&#xff41;虚拟机&#xff08;&#xff2a;&#xff36;&#xff2d;&#xff09;的核心组成部分之一&#xff0c;对&#xff2a;&#xff41;&#xff56;&#xff41;虚拟机的性能有非常重要的影响。本文将介绍&#xff2…

加油站ai视觉分析检测预警

加油站ai视觉分析预警系统通过yolov8图像识别和行为分析&#xff0c;加油站ai视觉分析预警算法识别出打电话抽烟、烟火行为、静电释放时间是否合规、灭火器摆放以及人员工服等不符合规定的行为&#xff0c;并发出预警信号以提醒相关人员。YOLOv8 的推理过程和 YOLOv5 几乎一样&…

什么是异步编程?什么是回调地狱(callback hell)以及如何避免它?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 异步编程⭐ 回调地狱&#xff08;Callback Hell&#xff09;⭐ 如何避免回调地狱1. 使用Promise2. 使用async/await3. 模块化和分离 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订…

Office软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Office是微软公司开发的一套办公软件套装&#xff0c;包括多个应用程序&#xff0c;如Word、Excel、PowerPoint等&#xff0c;是全球使用最广泛的办公软件之一。以下是Office软件的详细介绍。 1、Office的历史和演变 Office最…

基于和声算法优化的BP神经网络(预测应用) - 附代码

基于和声算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于和声算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.和声优化BP神经网络2.1 BP神经网络参数设置2.2 和声算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…