面试必问的CAS,你懂多少?

news2024/11/24 5:26:45

目录

  • 一.什么是CAS?
  • 二.CAS实现过程
  • 三.CAS的缺点
    • 1.循环时间长
    • 2.只能保证一个共享变量是原子操作
    • 3.ABA问题和解决方法
  • 四.拓展题
    • 1.i++和++i是原子性操作吗?
    • 2. i++ 不加lock和synchronized怎么保证原子性?

一.什么是CAS?

CAS(Compare And Swap): 比较并替换,是一种无锁算法。在不使用锁的情况下实现多线程之间的变量同步。

V: 主存的值
E: 预期的值
N: 新值

二.CAS实现过程

注意:
① 在线程开启的时候,会从主存中给每个线程拷贝一个变量副本到本线程各自的运行环境中。
② 失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次发起尝试。

并发环境: 执行 +1 操作,主存 V 初始值为 0,有两个线程 T1和T2。各自副本变量V1、V2为0,假设T1先拿到执行权

第一步: T1 读取当前 V1 的值赋值给 E1。
在这里插入图片描述

第二步: T1 执行 +1 操作,N1 = E1 + 1。
在这里插入图片描述

第三步: E1 和 主存 V比较,发现 E1 = V。
在这里插入图片描述

第四步: 将N1,写入主存,主存 V 变为 1。
在这里插入图片描述

第五步: T2拿到执行权,T2读取当前V2 的值赋值给 E2(这时V2还是0)。

在这里插入图片描述
第六步: T2 执行 +1 操作,N2 = E2 + 1。
在这里插入图片描述

第七步: E2 和 主存 V 比较,发现 E2 != V。
在这里插入图片描述

第八步: 重新获取 主存的值,V = 1,赋值给 V2,V2 赋值给E2。
在这里插入图片描述

第九步: T2 执行 +1 操作,N2 = E2 + 1。
在这里插入图片描述

第十步: E2 和 主存 V比较,发现 E2 = V。
在这里插入图片描述
第十一步: 将N2,写入主存,主存 V 变为 2。完成任务。
在这里插入图片描述

三.CAS的缺点

1.循环时间长

如果很多线程都去修改一个值,就会一直不成功一直尝试。

2.只能保证一个共享变量是原子操作

3.ABA问题和解决方法

原因: 线程1操作变量改为A,线程挂起,然后线程2操作变量改为X,又改为Z,最后改为A,其实中间变量的值已经被改变。
解决:
① 使用 AtomicStampReference 类,增加了一个标记 stamp,可以判断数据有没有被修改过。

public class AtomicStampedReference<V> {

    private static class Pair<T> {
        final T reference;
        final int stamp;
        private Pair(T reference, int stamp) {
            this.reference = reference;
            this.stamp = stamp;
        }
        static <T> Pair<T> of(T reference, int stamp) {
            return new Pair<T>(reference, stamp);
        }
    }

② 可以使用版本号,其实和上面stamp原理差不多。

四.拓展题

1.i++和++i是原子性操作吗?

不是原子性操作。不是一条单独的指令。是三条指令

第一步:获取这个值
第二步:+1
第三步:写回这个值

2. i++ 不加lock和synchronized怎么保证原子性?

有Atomic类里面有AtomicInteger类(底层是CAS)。

	//提供了硬件级别的原子操作,方法都是 native 修饰
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;
    public final boolean compareAndSet(int expect, int update) {
         //valueOffset=V,E=expect,N=update
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

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

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

相关文章

uboot源码结构、配置、编译和移植

目录 一、uboot源码结构 1.1 uboot源码获取 1.2 uboot的特点 1.3 uboot源码结构 二、uboot配置与编译 2.1uboot配置 2.2 uboot编译 三、uboot移植 3.1添加board信息 3.2再次配置和编译 3.3添加三星加密引导程序 3.4添加调制代码&#xff08;点灯法&#xff09; 3.…

CMMI-结项管理

结项管理&#xff08;ProjectClosing Management, PCM&#xff09;是指在项目开发工作结束后&#xff0c;对项目的有形资产和无形资产进行清算&#xff1b;对项目进行综合评估&#xff1b;总结经验教训等。结项管理过程域是SPP模型的重要组成部分。本规范阐述了结项管理的规程&…

绘图软件推荐——Diagram Designer

目录 Diagram Designer安装 软件下载 软件图标 Diagram Designer应用 新建页面 工具栏简介 绘制多边形 创建并添加图形模板 图像导出 Diagram Designer安装 软件下载 在腾讯管家&#xff0c;软件管理中 &#xff0c;搜索 Diagram Designer 即可下载软件图标 Diagram Des…

lio-sam学习笔记(三)

前言&#xff1a; 对于lio-sam前端中图像投影和特征提取部分的学习。 一、imageProjection.cpp main函数&#xff1a; int main(int argc, char** argv) {ros::init(argc, argv, "lio_sam");ImageProjection IP;ROS_INFO("\033[1;32m----> Image Project…

训练营day17

110.平衡二叉树 力扣题目链接 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 返回 true 。 示…

GIS矢量图形多边形地块行政区发光,阴影发光特效实现

先来看下效果: 其实做到发光效果我们必须明白两件事: 1.必须有亮色作为发光色 2.必须有暗色作为衬托色 二者缺一不可 如果你仅仅用了亮色,那么效果是这样的: 注意哦,我使用的是同一个颜色哦,为什么这一次看起来就不是发光呢? 原因很简单,第二幅图我没有加衬托色 ,…

Java基础常见面试题(一)

基础概念与常识 Java 语言有哪些特点? 简单易学&#xff1b;面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b;平台无关性&#xff0c;平台无关性的具体表现在于&#xff0c;Java 是“一次编写&#xff0c;到处运行&#xff08;Write Once&…

手把手教你将Eureka升级Nacos注册中心

由于原有SpringCloud体系版本比较老&#xff0c;最初的注册中心使用的Eureka后期官方无升级方案&#xff0c;配置中心无法在线管理配置&#xff0c;还有实时上下线的问题&#xff0c;因此需要将原有系统的Eureka服务升级Nacos注册心服务。原有版本SpringBoot1.5.15、SpringClou…

Python序列类型之集合

&#x1f490;&#x1f490;&#x1f490;欢迎来到小十一的博客&#xff01;&#xff01;&#xff01; &#x1f3af;博客主页&#xff1a;&#x1f3af;程序员小十一的博客 &#x1f680;博客专栏&#xff1a;&#x1f680;Python入门基础语法 &#x1f337;欢迎关注&#xff…

github报错Key is invalid. You must supply a key in OpenSSH public key format

原因&#xff1a;由于github官方提示 普通类型的ssh不安全&#xff0c;所以改成OpenSSH 解决办法 第一步&#xff1a;打开终端。粘贴下面的文本&#xff0c;替换为您的 GitHub 电子邮件地址。连续按回车键 ssh-keygen -t ed25519 -C "your_emailexample.com"第二步…

JavaWeb入门看这一篇文章就够了

第一章 JavaWeb简介 第1节 什么是web 1web&#xff08;World Wide Web&#xff09;即全球广域网&#xff0c;也称为万维网&#xff0c;它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务&#xff0c;为浏览者…

插入排序基本概念

插入排序基本概念1.插入排序1.1 基本概念1.2 插入排序执行步骤有1.3 对于5个元素的值步骤次数1.4 插入排序大O记法表示2. 将[4,2,7,1,3]进行插入排序 【实战】2.1 第一次轮回步骤2.2 第二次轮回步骤2.3 第三次轮回步骤2.4 第四次轮回步骤3.插入排序代码实现1.插入排序 1.1 基本…

VHDL语言基础-组合逻辑电路-译码器

目录 译码器的设计&#xff1a; 译码器的分类&#xff1a; 常用译码器&#xff1a; 3-8译码器&#xff1a; 3-8译码器的描述&#xff1a; 小结&#xff1a; 译码器的设计&#xff1a; 译码器和编码器是数字系统中广泛使用的多输入多输出组合逻辑部件。 实现译码的组合逻…

锁与原子操作

锁与原子操作 锁 以自增操作为例子&#xff1a; void *func(void *arg) {int *pcount (int *)arg;int i 0;//while (i < 100000) {(*pcount) ; // 并不会到达100000usleep(1);} }int main(){int i 0;for (i 0;i < THREAD_COUNT;i ) {pthread_create(&thid…

2023年,云计算还有发展前景吗?

云计算在促进经济回暖中扮演者不可或缺的角色&#xff0c;疫情期间复工复产都是基于云计算的基础设施&#xff0c;实现远程办公、在线学习、在线看病、在线政务等等。同时由于数字技术在各个领域的渗透和发展&#xff0c;社会整体对于云技术人才、云服务、算力服务等的需求都在…

虹科分享 | 作为域名系统的SPoF

“SPoF”或“单点故障”背后的思想是&#xff0c;如果系统的一部分发生故障&#xff0c;那么整个系统也会发生故障。 这是不可取的。在IT和安全领域&#xff0c;如果一个组件或子组件的故障会导致系统或应用程序严重中断或降级&#xff0c;那么我们通常认为设计有缺陷。 这就…

OpenAI GPT3 + Flask 利用 text-davinci-003 API 制作自己的交互网页教程 | 附源码 和 Github链接

1. OpenAI GPT3 text-davinci-003 API 最近ChatGPT很火&#xff0c;使用与InstructGPT相同的方法&#xff0c;使用来自人类反馈的强化学习 Reinforcement Learning from Human Feedback (RLHF) 来训练该模型&#xff0c;但数据收集设置略有不同。ChatGPT是在 GPT-3.5 系列中的…

JavaWEB-Servlet

目录 Servlet简介Servlet快速入门Servlet配置详解ServletContext 1 Servlet简介 Servlet 运行在服务端的Java小程序&#xff0c;是sun公司提供一套规范&#xff08;接口&#xff09;&#xff0c;用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码&a…

101-并发编程详解(上篇)

并发编程详解在学习之前&#xff0c;如果多线程的理解足够&#xff0c;可以往下学习&#xff0c;否则的话&#xff0c;建议先看看26章博客&#xff08;只是建议&#xff09;&#xff0c;注意&#xff1a;可能有些字的字体不对&#xff0c;那么一般是复制粘贴来的&#xff0c;但…

前端构建工具 Vite

文章目录参考环境构建工具构建工具的主要功能目前主流的前端构建工具Vite为什么使用 Vite冷启动WebpackVite热更新优化热更新优化预构建依赖Webpack VS ViteVite 的缺点首屏性能懒加载与 Vite 相关的基本操作获取create-vite创建项目Project nameSelect a frameworkSelect a va…