前言:
眼前同学们对“cas算法缺点”大概比较关心,各位老铁们都需要知道一些“cas算法缺点”的相关文章。那么小编同时在网络上汇集了一些对于“cas算法缺点””的相关资讯,希望小伙伴们能喜欢,大家快快来学习一下吧!欢迎关注头条号:老顾聊技术
精品原创技术分享,知识的组装工
前言
这道题是考察面试者的并发编程的知识,关于悲观锁和乐观锁的。
锁
回答这个问题,可以先介绍一下锁要解决的问题,以及锁机制的缺点。
引入锁就是为了解决多线程竞争同一个资源时,出现脏读、数据不一致问题。一般我们常用的是synchronized等排他锁,
这种锁存在的问题:
1、多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题
2、一个线程持有锁会导致其它所有需要此锁的线程挂起直至该锁释放
CAS
cas是另一个无锁解决方案,更准确的是采用乐观锁技术,实现线程安全的问题。cas有三个操作数----内存对象(V)、预期原值(A)、新值(B)。
CAS原理就是对v对象进行赋值时,先判断原来的值是否为A,如果为A,就把新值B赋值到V对象上面,如果原来的值不是A(代表V的值放生了变化),就不赋新值。
小伙伴们应该知道j.u.c并发编程包,我们看一下AtomicInteger类,AtomicInteger是线程安全的,我们看一下源码
再看一下unsafe源码
我们看到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%消息投递成功吗?
标签: #cas算法缺点