CAS简介

news2024/11/16 10:31:14

文章目录

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


前言

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());
        }
    }
}

总结

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

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

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

相关文章

基于YOLOv5的目标检测系统详解(附MATLAB GUI版代码)

摘要&#xff1a;本文重点介绍了基于YOLOv5目标检测系统的MATLAB实现&#xff0c;用于智能检测物体种类并记录和保存结果&#xff0c;对各种物体检测结果可视化&#xff0c;提高目标识别的便捷性和准确性。本文详细阐述了目标检测系统的原理&#xff0c;并给出MATLAB的实现代码…

IPRAN网络结构智能优化

IPRAN&#xff08;Internet Protocol Radio Access Network&#xff09;是指基于IP技术的无线接入网络&#xff0c;是当前移动通信重要基础网络。然而&#xff0c;随着技术的快速发展&#xff0c;IPRAN网络规模不断扩大&#xff0c;网络结构日趋复杂&#xff0c;运维网优愈发困…

基于数据和AI之上,数说故事首发“人、货、场、域”W-SCC测量体系|D3大会演讲实录

无测量&#xff0c;不营销。 品牌在加速更迭、场景在垂直发展、需求在不断升级&#xff0c;借助数字化力量可以实现更精准、长效的营销增长。但如果连营销效果都无法被量化测量&#xff0c;那么一切为了增长的“轮番”操作只会沦为“锦团花簇”&#xff0c;品牌营销的真正实效…

使用ChatGPT工具阅读文献的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

PySpark基础入门(1):基础概念+环境搭建

目录 Spark基础入门 spark基础概念 spark架构 Spark环境搭建 local模式 Standalone 模式 Spark On YARN 模式 PySpark开发环境搭建 Python On Spark 执行原理 更好的阅读体验&#xff1a;PySpark基础入门&#xff08;1&#xff09;&#xff1a;基础概念&#xff0b;环…

国产仪器 9906在线式户外多通道光伏组件评测系统 可替代EKO MP-160

9906 在线式户外多通道光伏组件评测系统可替代国外仪器型号&#xff1a;EKO MP-160 在线式户外多通道光伏组件评测系统是一款支持实时多通道光伏组件测试的评测系统&#xff0c;提供真6路电子负载&#xff0c;提供多至6通道的实时测试能力&#xff0c;并可根据用户需求订制通道…

TouchGFX开发(1)----安装软件

TouchGFX开发.1----安装软件 概述TouchGFX 特点下载&安装 概述 TouchGFX 是一个高性能的嵌入式图形库&#xff0c;主要用于为微控制器&#xff08;MCU&#xff09;驱动的设备创建现代用户界面&#xff08;UI&#xff09;。它提供了一套丰富的图形功能&#xff0c;使开发者…

[SWPU CTF]之Misc篇(NSSCTF)刷题记录⑥

NSSCTF-Misc篇-[SWPUCTF] [长城杯 2021 院校组]签到[巅峰极客 2021]签到[羊城杯 2021]签到题[鹤城杯 2021]流量分析[SWPU 2019]神奇的二维码[NISACTF 2022]为什么我什么都看不见[NISACTF 2022]bqt[SWPU 2020]套娃[NISACTF 2022]huaji&#xff1f;[SWPUCTF 2021 新生赛]gif好像有…

Mybatis之配置文件与映射文件的“那些事”,你真的知道吗?

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 目录 一.详解Mybatis的核心配置文件【mybatis-config.xml】1.1 核心配置文件概述1.2 核心配置文件之根标签1…

基于Java的房屋租赁管理系统开发与设计(附源码文档)-毕业设计

文章目录 1.适用人群2.你将收获3.项目概述3.1.项目背景3.2.项目简介3.3.软件技术栈 4.项目运行截图4.1.登陆界面4.2.首页4.3.修改密码4.4.用户管理模块4.5.权限管理模块4.6.资源管理模块4.7.区域设置模块4.8.房屋类型管理模块4.9.房屋管理模块4.10.房间管理模块4.11.房东管理模…

论文浅尝 | 利用关系路径的混合语义进行知识图的多跳问答

笔记整理&#xff1a;金龙&#xff0c;浙江大学硕士&#xff0c;研究方向知识图谱 链接&#xff1a;https://aclanthology.org/2022.coling-1.156/ 动机 知识图谱上回答自然语言问题(KGQA)仍然多跳推理面临的一个巨大的挑战。以前的方法通常是利用大规模的实体相关文本体或知识…

MAC移动硬盘无法正常推出:“磁盘无法推出,因为一个或多个程序正在使用它”

MAC移动硬盘在使用中&#xff0c;经常会碰到无法正常退出的情况&#xff0c;提示&#xff1a;“磁盘无法推出&#xff0c;因为一个或多个程序正在使用它”&#xff0c;如果你“直接拔掉”或“强行推出”的话&#xff0c;可能导致你下次重新连接移动硬盘无法识别。&#xff08;参…

[python] 协程学习从0到1,配合案例,彻底理解协程,耗费资源不增加,效果接近多线程

文章目录 前言1.python 生成器1.1 python 生成器概述1.2 关键字yield/yield from1.3 next/send函数1.4 StopInteration异常1.5 利用生成器实现生产者-消费者模型1.6 生成器和协程的关系 2.生成器协程调度器3.python事件驱动编程4.实现协程调度器5.python 协程生态 前言 多进程…

代码随想录算法训练营第二十九天 | 递增子序列(新的树层去重)、排列、排列中树枝树层去重

491.递增子序列 文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;回溯算法精讲&#xff0c;树层去重与树枝去重 | LeetCode&#xff1a;491.递增子序列_哔哩哔哩_bilibili 状态&#xff1a;能直接写出来。不过还是要再看一遍&#xff0c;因为是新的去…

行人重识别(REID)——原理方法

行人重识别&#xff1a;短时 类内差异增大&#xff0c;类间差异减小 应用——行人跟踪 单摄像头单目标单摄像头多目标多摄像头多目标 行人重识别系统 特征提取 学习能够应对在不同摄像头下行人变化的特征 度量学习 将学习到的特征映射到新的空间使相同的人更近&#xff0c…

【每日一练】谷歌面试题:用JAVA翻转二叉搜索树

文章目录 前言题目分析实战演示1、创建一颗搜索二叉树2、中序遍历二叉搜索树3、根据题意创建二叉搜索树并展示4、算法增加二叉树翻转方法5、根据题意测试翻转二叉树结果6、完整代码 前言 很多同学应该都能够模拟出一个二叉树&#xff0c;那么又有多少同学能够写出翻转二叉树呢…

2d俯视视角游戏,可以切换多种枪械

文章目录 一、 介绍二、 人物移动、鼠标控制转向三、子弹脚本四、子弹随机抛壳五、 爆炸特效六、 发射子弹七、 子弹、弹壳对象池八、 散弹枪九、 火箭弹、发射火箭十、 下载工程文件 一、 介绍 2d俯视视角游戏。 人物视角跟随鼠标移动 多种枪械 抛壳效果 多种设计效果 对象池…

『python爬虫』10. 数据解析之xpath解析(保姆级图文)

目录 安装库xpath入门怎么快速得到xpath路径xpath节点的关系xpath方法小型实战总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 安装库 pip install lxmlxpath入门 怎么快速得到xpath路径 &#xff08;相对路…

第三十章 Unity角色控制器 Character Controller

在我们之前的章节中&#xff0c;我们已经了解了碰撞体和刚体。但是&#xff0c;对于刚体这个组件来讲&#xff0c;有两种使用方式。其一就是用它来模拟现实世界的移动或碰撞效果&#xff08;例如&#xff0c;门的开关&#xff09;&#xff1b;其二就是使用代码来控制物体移动或…

【网络进阶】HTTP服务器(一)

文章目录 1. HTTP简介2. HTTP工作原理3. HTTP注意事项4. HTTP消息结构5. 客户端请求消息6. 服务器响应消息7. GET传递数据实例8. HTTP请求方法9. HTTP响应头信息 1. HTTP简介 HTTP&#xff08;超文本传输协议&#xff0c;Hypertext Transfer Protocol&#xff09;是一种用于传…