能谈一下 CAS 机制吗

news/2024/7/23 17:49:20 标签: java, 开发语言
(本文摘自mic老师面试文档)
一个小伙伴私信我,他说遇到了一个关于 CAS 机制的问题,他以为面试官问的是 CAS
实现单点登录。
心想,这个问题我熟啊,然后就按照单点登录的思路去回答,结果面试官一直摇头。
他来和我说,到了面试结束都没明想白自己回答这么好,怎么就没有当场给我发 offer
呢?
实际上,面试官问的是并发编程中的 CAS 机制。
下面我们来看看普通人和高手对于 CAS 机制的回答吧
普通人
CAS,是并发编程中用来实现原子性功能的一种操作,嗯,它类似于一种乐观锁的机制,
可以保证并发情况下对共享变量的值的更改的原子性。
嗯, 像 AtomicInteger 这个类中,就用到了 CAS 机制。嗯…
高手
CAS 是 Java 中 Unsafe 类里面的方法,它的全称是 CompareAndSwap,比较并交换
的意思。它的主要功能是能够保证在多线程环境下,对于共享变量的修改的原子性。
我来举个例子,比如说有这样一个场景(如图),有一个成员变量 state,默认值是 0,
定义了一个方法 doSomething(),这个方法的逻辑是,判断 state 是否为 0 ,如果为
0,就修改成 1。
这个逻辑看起来没有任何问题,但是在多线程环境下,会存在原子性的问题,因为这里
是一个典型的,Read - Write 的操作。
一般情况下,我们会在 doSomething()这个方法上加同步锁来解决原子性问题。
但是,加同步锁,会带来性能上的损耗,所以,对于这类场景,我们就可以使用 CAS
机制来进行优化
这个是优化之后的代码(如图)
在 doSomething()方法中,我们调用了 unsafe 类中的 compareAndSwapInt()方法来
达到同样的目的,这个方法有四个参数,
分别是:当前对象实例、成员变量 state 在内存地址中的偏移量、预期值 0、期望更改
之后的值 1。
CAS机制会比较 state 内存地址偏移量对应的值和传入的预期值 0 是否相等,如果相等,
就直接修改内存地址中 state 的值为 1. 否则,返回 false,表示修改失败,而这个过程是原子的,不会存在线程安全问题
CompareAndSwap 是一个 native 方法,实际上它最终还是会面临同样的问题,就是
先从内存地址中读取 state 的值,然后去比较,最后再修改。
这个过程不管是在什么层面上实现,都会存在原子性问题。
所以呢,CompareAndSwap 的底层实现中,在多核 CPU 环境下,会增加一个 Lock
指令对缓存或者总线加锁,从而保证比较并替换这两个指令的原子性。
CAS 主要用在并发场景中,比较典型的使用场景有两个。
1. 第一个是 J.U.C 里面 Atomic 的原子实现,比如 AtomicInteger,AtomicLong。
2. 第二个是实现多线程对共享资源竞争的互斥性质,比如在 AQS、
ConcurrentHashMap、ConcurrentLinkedQueue 等都有用到。
以上就是我对这个问题的理解。
结尾
最近大家也发现了我的视频内容在高手回答部分的变化。
有些小伙伴说,你面试怎么还能带图来,明显作弊啊。 其实主要是最近很多的面试题都偏底层,而底层的内容涵盖的知识面比较广,大家平时
几乎没有接触过。
所以,如果我想要去把这些知识传递给大家,就得做很多的图形和内容结构的设计,否
则大家听完之后还是一脸懵逼。
好的,本期的普通人 VS 高手面试系列的视频就到这里结束了,喜欢的朋友记得点赞收
藏。

http://www.niftyadmin.cn/n/5166211.html

相关文章

浅谈数据结构之链表

链表是一种灵活的数据结构,有单向链表、双向链表和循环链表等多种形式。在本文中,我们将深入探讨单向链表、双向链表、循环链表的定义、Java实现方式、使用场景,同时比较它们的不同之处。我们还会介绍链表与队列之间的区别。 单向链表 定义…

简述扫码登录原理及测试要点

扫码登录本质是解决将APP端的用户登录信息(通常是Token)通过扫码的形式安全稳定地同步给Web端。 操作流程: 打开登录页面,展示一个二维码(web);打开APP扫描该二维码后,APP显示确认、取消按钮(app)&#xf…

力扣最热一百题——每日温度

Python后面的文章,内容都比较多,但是同时我又想保持每天更新的速度,所以Python的文章我继续打磨打磨,先更新一篇算法的文章。 一身正气报国家,旁无乱境不恋她 ヾ(◍∇◍)ノ゙ 力扣题号&#xff1a…

点信息标注_BillboardTextActor3D

开发环境: Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码 demo解决问题:点附近创建左边或其他信息,且信息面板显示状态不受相机缩放、旋转影响 prj name: BillboardTextActor3D #include…

【ROS】Nav2源码之nav2_smoother(平滑器)详解

【ROS】郭老二博文之:ROS目录 1、简述 从路径规划模块’ nav2_planner 中给出路径通常是不平滑的。 所谓平滑器就是使规划的路径更平滑、平稳,可以运行的更优雅,并且减少硬件的磨损。 nav2_smoother在Nav2导航中的定义了平滑器接口的,nav2_smoother加载了一组平滑器插件,…

Jekyll框架编译GithubPages,提示没有docs

Jekyll Converters::Scss build issue: No such file or directory dir_chdir - /github/workspace/docs Error: No such file or directory dir_chdir - /github/workspace/docs 解决方案: 修改github page仓库中–> 设置—> pages 把里面的\docs&#xf…

MapReduce 读写数据库

MapReduce 读写数据库 经常听到小伙伴吐槽 MapReduce 计算的结果无法直接写入数据库, 实际上 MapReduce 是有操作数据库实现的 本案例代码将实现 MapReduce 数据库读写操作和将数据表中数据复制到另外一张数据表中 准备数据表 create database htu; use htu; creat…

建链时,报错2

please install openssl! use “openssl version” command to check. 但是我已经安装了 编辑build_chain.sh文件 也可以用vi或者gedit命令 将 [ ! -z “ ( o p e n s s l v e r s i o n ∣ g r e p 1.0.2 ) " ] ∣ ∣ [ ! − z " (openssl version | grep 1.0.2)…