CAS和AQS

1、CAS是乐观锁,在concurrentHashmap中的putval方法中会用到CAS
非阻塞的实现CAS:CAS指令需要3个操作数,分别是内存地址(在JAVA中理解为变量的内存地址,用V表示),旧的预期值(用A表示),新值(B)。CAS指令执行时,当且仅当V处的值符合旧预期值A时,处理器用B更新A值,否则它就不执行更新,但是无论是否更新了V处的值,都会返回V的旧值,上述的处理过程是一个原子操作。
CAS缺点 :ABA问题:因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是一个值原来是A,变成B,又变成A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。
ABA问题的解决思路就是使用版本号。在变量前面追加版本号,每次变量更新的时候把版本号加一,那么A-B-A就变成了1A-2B-3C。

**2、CAS还有可能引发的问题**:
1.ABA问题;
2.不停的自旋等待,造成处理器资源浪费; (可以通过加sleep+自旋,这样可以让线程进入睡眠)
3.CAS只能保证对一个变量操作的原子性,而不能保证对代码块操作的原子性

当许多线程都可以进入一个方法内对变量进行修改的时候,由于线程数量过于密集,导致大部分进程都无法成功修改变量的值,白白在那里循环消耗着资源。所以java对它进行了优化引入了一个cell[]数组,比如有5个线程

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值