每日一面——什么是CAS算法?

菜鸡每日一面系列打卡17

每天一道面试题目 

助力小伙伴轻松拿offer

坚持就是胜利,我们一起努力!

题目描述

什么是CAS算法?

题目分析

前两篇文章中提到的synchronized关键字和ReentrantLock都属于悲观锁,属于互斥同步的两种实现,本篇文章要提到的CAS算法是一种乐观锁,属于非阻塞同步的范畴。这种神奇的算法可以在不加锁的前提下保证线程安全,也是面试过程中考查的热点,了解这一算法的思想,将更有助于加深对并发编程的认识。

接下来,随菜鸡一起去看看吧。

题目解答

01

概述

CAS全称compare and swap,顾名思义,即比较与交换。该算法是一种无锁算法,可以在不加锁的前提下保证线程安全,即在没有线程被阻塞的情况下实现变量同步,因此属于非阻塞同步的范畴。

既然是无锁算法,为什么又说其属于乐观锁呢?其实无论是悲观锁还是乐观锁,都传达的是一种态度。悲观锁,悲观,为了防止出现线程安全问题提前加锁同步;乐观锁,乐观,先假设不会出现线程安全问题,真出现问题之后再作处理。CAS算法是乐观的态度,因此属于乐观锁

CAS算法涉及到三个操作数:内存值V、比较值A、交换值B。其具体的操作步骤是,当且仅当V等于A时,CAS算法通过原子方式用B将V替换,否则不执行任何操作。一般情况下,CAS算法是一个自旋操作,即不断的重试直到成功为止。

02

特点

CAS算法有如下特点:ABA问题,存在自旋开销,只保证一个共享变量的原子操作。

  • ABA问题。若变量V初次读取时为A,在准备赋值时检查其仍为A,但这不能说明它没有被其他线程修改过,因为在这段时间它可能被改为其他值,然后又改为A,此时CAS算法就会误认为它从未修改过。该问题被称为CAS算法的ABA问题。在实际使用场景中需判断,若ABA问题对该使用场景的影响不大,可以不作处理。否则,可以采取对每次修改添加版本号标识的方式解决ABA问题,或直接采用悲观锁。

  • 存在自旋开销。在概述中已经提到了,CAS算法是一个自旋操作,拥有不撞南墙不回头的精神,在失败时会不断重试直到成功为止。但这种自旋如果长时间存在,将会对CPU造成很大的负担。这也就是所谓的自旋开销。

  • 只保证一个共享变量的原子操作。CAS算法只对单个共享变量有效,当操作跨多个共享变量时CAS算法将不能保证同步。一种解决方式是,将这些共享变量封装为一个对象之后再使用CAS算法进行处理。

03

总结

基于CAS算法的上述特点,可以总结出其使用场景,在这里同之前谈过的synchronized关键字做一个比较,使大家更清楚地认识到二者的区别。

  • CAS算法适用于读多写少的场景。这种场景下,线程间的冲突较少,自旋带来的性能损失较小,此时采用CAS算法,可以避免采用synchronized关键字而带来的线程阻塞与唤醒的开销,从而提高效率。

  • synchronized关键字适用于写多读少的场景。这种场景下,线程间的冲突较多,CAS算法自旋带来的性能损耗严重,此时宜采用synchronized关键字进行同步。

  • 读多写少是乐观的资本,写多读少是悲观的源头。至此,小伙伴们对悲观锁与乐观锁的认识应该又加深了一些。


以上便是菜鸡对CAS算法的一些总结,供大家参考。

相关链接

每日一面——谈谈你对synchronized关键字的理解

每日一面——谈谈你对ReentrantLock的理解

学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值