Redian新闻
>
美团终面:你确定CAS不加锁吗?

美团终面:你确定CAS不加锁吗?

公众号新闻

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 
来源:Hollis

CAS大家都知道,这是一项乐观锁技术,是Compare And Swap的简称,顾名思义就是先比较再替换。

虽然他叫乐观锁,但是我们都知道它是不需要加锁的,在JDK1.5 中的JUC就是建立在CAS之上的。相对于synchronized这种阻塞算法,CAS是非阻塞算法的一种常见实现。所以J.U.C在性能上有了很大的提升。

我们以java.util.concurrent中的AtomicInteger为例,看一下在不使用锁的情况下是如何保证线程安全的。主要理解getAndIncrement方法,该方法的作用相当于 ++i 操作:

public class AtomicInteger extends Number implements java.io.Serializable {  

        private volatile int value;  

    public final int get() {  
        return value;  
    }  

    public final int getAndIncrement() {  
        for (;;) {  
            int current = get();  
            int next = current + 1;  
            if (compareAndSet(current, next))  
                return current;  
        }  
    }  

    public final boolean compareAndSet(int expect, int update) {  
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);  
    }  
}

getAndIncrement采用了CAS操作,每次从内存中读取数据然后将此数据和+1后的结果进行CAS操作,如果成功就返回结果,否则重试直到成功为止。而compareAndSet利用unsafe的compareAndSwapInt方法实现的。

啥是Unsafe呢?

Unsafe是CAS的核心类。因为Java无法直接访问底层操作系统,而是通过本地(native)方法来访问。不过尽管如此,JVM还是开了一个后门,JDK中有一个类Unsafe,它提供了硬件级别的原子操作。

Unsafe是Java中一个底层类,包含了很多基础的操作,比如数组操作、对象操作、内存操作、CAS操作、线程(park)操作、栅栏(Fence)操作,JUC包、一些三方框架都使用Unsafe类来保证并发安全。

Unsafe类提供了硬件级别的原子操作,如CAS原子操作。

但是,大家有没有想过这样的问题:

硬件层面CAS又是如何保证原子性的呢?真的完全没加锁吗?

拿比较常见的x86架构的CPU来说,其实 CAS 操作通常使用 cmpxchg 指令实现的。

可是为啥cmpxchg 指令能保证原子性呢?主要是有以下几个方面的保障:

  1. cmpxchg 指令是一条原子指令。在 CPU 执行 cmpxchg 指令时,处理器会自动锁定总线,防止其他 CPU 访问共享变量,然后执行比较和交换操作,最后释放总线。

  2. cmpxchg 指令在执行期间,CPU 会自动禁止中断 。这样可以确保 CAS 操作的原子性,避免中断或其他干扰对操作的影响。

  3. cmpxchg 指令是硬件实现的,可以保证其原子性和正确性。CPU 中的硬件电路确保了 cmpxchg 指令的正确执行,以及对共享变量的访问是原子的。

所以,在操作系统层面,CAS还是会加锁的,通过加锁的方式锁定总线,避免其他CPU访问共享变量。

所以,解决并发问题,归根结底还得靠锁!!!



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
【NEU的本科生看过来!】【学校附近太贵?Malden太远?】【橙线门口巨便宜高级公寓你确定不考虑一下?】6年了! 大温华裔小女孩谋杀案终于要开庭了! 多年的谜团终将揭晓!金毛被奶奶忽视后,立马挡在电视前面:它有我好看吗?老街坊找不着北, 高尔夫找不到球看完狂飙,想去广东吃肠粉了!安欣和指导组都吃的广式肠粉,你确定不尝尝吗?UNReal 每周一场主题电音节|本周六𝘿𝙧𝙪𝙢 𝙣' 𝘽𝙖𝙨𝙨 炸裂舞池!美团王兴朋友圈维权?曾存放6192万美元的硅谷银行破产跑路?美团紧急辟谣GraphPad Prism 9 入门,3分钟上手,5分钟出图,分分钟搞定CNS级美图!29位科技投资人预言2023:「不确定」中的29个「小确定」I’m all yours不是在向你表白!理解错就很尴尬了!"white night"也不是白色夜晚的意思哦!这个AI写作工具,1秒生成文章!你确定不来试一下?支付宝二面:使用 try-catch 捕获异常会影响性能吗?大部分人都会答错!美团二面:SPI 的原理是什么?商汤回应AI作图争议/ 推特公司不存在了/ 巴菲特:不确定ChatGPT是否有益…今日更多新鲜事在此纽约打工人:这是年会?你确定不是百老汇现场?美团王兴鲜为人知的一面:拿钱为“嫡系”站台美团四面:如何保障 MySQL 和 Redis 的数据一致性?熟人进局子的故事,你确定敢听吗?纽约每天30人死于XBB喊话某券商:你确定不是为了来淄博吃烧烤?新东方在线拟更名东方甄选,俞敏洪:“在不确定性中做确定的事情”红场上的东正教堂美团王兴朋友圈爆了!宣布将个人投资"一生挚友"的创业项目,美团二号人物要复出"卷"AI想学PS不知从何下手?这8个基本操作学会,你的PS就很牛了!红糖翻译成red sugar?你确定红糖真的是红色的吗?日本啊,日本(二十一)清酒的滋味不爱帝豪不许看!限时3天双倍积分:Tim Hortons不抠搜了美团电商宣告失败?负责人离职业务并至美团优选,曾是网易严选CEO心态崩了! 蒙特利尔人中$10,000大奖, 结果Tim Hortons不认账…研究:疫情对心理健康没啥影响!引来外国网友大型群嘲:呵呵你确定?4000+岗位,美团2023届春招&24届转正实习开启(内含美团求职工具包)!六险一金,年终双薪,弹性工作,互联网大厂...美团近期将上线「美团企业版」,先做企业用餐|LongChina50独家逛跳蚤市场的收获1970年,一女子难产生下小孩,毛主席泪流满面:你是毛家的大功臣【NEU本科生强推!】【23年新房福利!最高3月免单】【门口橙线/免中介费!你确定不考虑一下?】
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。