什么是CAS?CAS的作用以及缺点

老顾聊技术 2019-06-03 00:28:00

欢迎关注头条号:老顾聊技术

精品原创技术分享,知识的组装工


前言

这道题是考察面试者的并发编程的知识,关于悲观锁和乐观锁的。

回答这个问题,可以先介绍一下锁要解决的问题,以及锁机制的缺点。

引入锁就是为了解决多线程竞争同一个资源时,出现脏读、数据不一致问题。一般我们常用的是synchronized等排他锁,

这种锁存在的问题

1、多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题

2、一个线程持有锁会导致其它所有需要此锁的线程挂起直至该锁释放

CAS

cas是另一个无锁解决方案,更准确的是采用乐观锁技术,实现线程安全的问题。cas有三个操作数----内存对象(V)、预期原值(A)、新值(B)

CAS原理就是对v对象进行赋值时,先判断原来的值是否为A,如果为A,就把新值B赋值到V对象上面,如果原来的值不是A(代表V的值放生了变化),就不赋新值。

小伙伴们应该知道j.u.c并发编程包,我们看一下AtomicInteger类,AtomicInteger是线程安全的,我们看一下源码

面试题:什么是CAS?CAS的作用以及缺点

 

再看一下unsafe源码

面试题:什么是CAS?CAS的作用以及缺点

 

我们看到do while自循环,这里为什么会有自循环,就是在 判断预期原值 如果与原来的值不符合,会再循环取原值,再走CAS流程,直到能够把新值B赋值成功。

CAS缺点

cas这个方式也存在一定的问题:

1、自循环时间长,开销大

2、只能保证一个共享变量的原子操作

3、ABA问题

ABA问题是什么,小伙伴们自行网上看一下哦,面试也有可能问到。


-End-

如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!

10几年的经验实战分享

相关微服务,分布式,高并发,高可用,企业实战,干货等原创文章正在路上

欢迎关注头条号:老顾聊技术精品原创技术分享,知识的组装工

推荐阅读

1、如何访问redis中的海量数据?避免事故产生

2、如何解决Redis热点问题?以及如何发现热点?

3、如何设计API接口,实现统一格式返回?

4、你真的知道在生产环境下如何部署tomcat吗?

5、分享一线互联网大厂分布式唯一ID设计 之 snowflake方案

6、分享大厂分布式唯一ID设计方案,快来围观

7、你想了解一线大厂的分布式唯一ID生成方案吗?

8、你知道如何处理大数据量吗?(数据拆分篇)

9、如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇)

10、你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?

11、你了解大型网站的页面静态化吗?

12、你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?

13、你知道怎么解决DB读写分离,导致数据不一致问题吗?

14、DB读写分离情况下,如何解决缓存和数据库不一致性问题?

15、你真的知道怎么使用缓存吗?

16、如何利用锁,防止缓存击穿?重构思想的重要性

17、海量订单产生的业务高峰期,如何避免消息的重复消费?

18、你知道如何保障生产端100%消息投递成功吗?

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值