首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试题93:什么是CAS?存在哪些问题?

面试题93:什么是CAS?存在哪些问题?

作者头像
爪哇缪斯
发布于 2023-05-10 02:54:15
发布于 2023-05-10 02:54:15
2430
举报
文章被收录于专栏:爪哇缪斯爪哇缪斯

【什么是CAS】

  • CAS(Compare And Swap),即:对值先进行比较,符合我们的预期之后再进行赋值操作。
  • CAS是一种基于乐观锁的操作。
  • Java中锁是分为乐观锁和悲观锁的。
    • 乐观锁 乐观的认为发生锁冲突的概率很低,所以采取了一种宽泛的态度,通过某种处理方式而不是采用加锁来控制资源共享。在高并发下,优点是性能会比悲观锁高很多,但是实现起来会比悲观锁更复杂。
    • 悲观锁 悲观的认为发生锁冲突的概率很高。所以每当操作共享资源的时候,它都会将资源的使用权锁住,而当操作完毕之后,才释放这个资源的使用权,等待下一条线程对资源进行操作访问。
  • CAS操作主要来说包含三个概念:内存位置、预期原值和待赋值的新值。如果内存地址里面的值与预期原值相同,则将该值修改为新值,否则就不会对其进行修改。所以,使用CAS的时候,是要配合无限循环来进行:“获取原值——>对比原值——>尝试赋值”的操作的。如果第一次循环发现原值不匹配,无法对其赋予新值,那么修改预期原值,再次执行循环,尝试第二次赋值。

【CAS存在哪些问题】

  • ABA问题 一个线程A将数组1修改为了2,接着又将2修改为了1,那么当线程B要执行CAS操作的时候,它只会看到值依然是1,而并不知道中间有过1——>2——>1的操作过程。那么针对这个问题,可以采取版本号来进行历史操作的识别,没操作一次,那么版本号都会+1。 在Java5中,已经提供了AtomicStampedReference来解决问题。
  • 不能保证代码块的原子性 CAS机制所保证的只是变量的原子性操作,而不能保证整个代码块的原子性,所以,这时候就需要使用synchronize了。
  • CAS造成CPU利用率增加 如果在开发中,我们要通过CAS去修改某个变量,并且只要修改不成功,就要一直循环尝试修改,如果某条线程一直没有获取到变量所期待的值,那么会处于循环中,cpu资源会被一直占用。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爪哇缪斯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档