CAS理解

说到多线程肯定要理解锁,锁可以分为悲观锁和乐观锁,比如独占锁就是悲观锁,synchronized就是一种独占锁。

何为悲观,认为每一次操作数据,都可能会发生冲突,所以采用的策略是,先锁定再访问,保证在加锁阶段只有自己可以操作数据。
何为乐观,就是我认为大多数情况下,操作的数据不会发生冲突,所以不会加锁,只会在更新数据时,根据逻辑去判断是否冲突,发生冲突后返回异常信息,由用户决定如何处理。

下面就要说到乐观锁用到的处理逻辑,即是如何判断是否冲突,以及冲突后如何处理

CAS(compare and swap),中文翻译为比较并交换,CAS包含三个操作数,内存位置(V)、预期原值(A)、新值(B)。如果内存位置的值和预期原值相匹配,则将内存位置的值更新为新值,否则,不进行任何操作,只返回该内存位置的值。

很容易理解上面这段话,思考JMM,每一个线程都有一个工作内存,然后总体有一个主内存,内存位置就是主内存中存储的共享变量的值,预期原值就是每个线程工作内存中变量的值,新值就是工作内存中变量计算之后的值。每次从工作内存写到主内存时,判断主内存和当前工作内存中变量的值是否一致,一致说明没有其他线程修改过该值,直接将新的值更新到主内存,不一致说明有其他线程修改过,此时读取内存位置的值,进行重新计算

CAS也有对应的问题?
1、比如ABA的问题,CAS比较最终的值和预期原值是否一致,比如之前是A,变成了B,然后再变成A,按上面的规则,就是一致的,可以更新,忽略了中间数据的变化。此时需要引入版本号的方式,每次变量更新将其版本号加1,版本号不一致也是不匹配。
2、还有一个问题,发生冲突不进行任何操作,只返回该内存的值,但是如果长期失败,一直在循环,会导致cpu执行开销很大。
3、只能保证一个共享变量的原子操作,如果有多个共享变量,就无法保证了

posted @   浪迹天涯的派大星  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示