手写CAS,把它变成你自己的CAS

cas java 主要由JNI实现, java native interface

调用c语言来执行cpu的指令,而cpu则执行指令,"cmpchg"执行来进行比较替换的操作,这是一个原子性的操作

在多核心情况下,会对"总线"加锁,cp加锁,保证

缺陷:

多线程时只有一个线程可以执行,其他线程会随之等待,而在等待的时候,已经拿到了原值和,新值,

这是最先进去的线程已经把值修改了,这样会导致后面其他的线程在进行对比是错误,再次进行获取值,while循环消耗性

ABA:

多线程状态下, 当你拿拿到的原值,并且在等待获取锁执行下一步操作时,其他线程比你抢先一步拿到cpu调度,讲原值修改成了新值,走了,然后第二个线程又比你先拿到cpu调度,进行了一些业务操作之后吧值改为了之前的值,就是你手里的值,第三次终于轮到你了,你发现你拿到的值和内存中的值依然一直,就去进行下一步的操作,殊不知这个值已经进行了一些改变

ABA:问题解决

原值 + 版本号 双判断解决

JDK AtomicStampReference<?> 可解决

CAS java自行实现demo


    package learn;
    
    /**
     * Created with IDEA
     *
     * @author: linyi
     * @Email: linyi4843@gmail.com
     */
    public class CompareAndSwap {
   
        /**
         * cas 原则: 原值 = 预期值 的情况下更新  新值
         *
         * 原值: count当前的值
         * 预期值: count最新的值
         * 新值: 需要更新的值
         */
    
        /**
         * 实时获取count的值,不会获取缓存值
         */
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值