美文网首页
CAS compare and swap  比较和交换

CAS compare and swap  比较和交换

作者: 胡壮壮菜鸟起飞 | 来源:发表于2020-09-28 21:59 被阅读0次

    进程:火车 一个进程可以有多个线程

    线程:车厢 必须依赖火车才能运行

    操作系统:铁轨 可以跑多列火车

    Jmm:java 并发共享内存模型 一种抽象理解。

    并发:多个线程交替运行,争抢访问共享变量

    并行:在多核系统中存在,同一时刻不同cpu运行不同操作

    volatile 关键字  保证可见性  禁止指令重排序但不保证原子性。如何实现? 遇到volatile修饰的变量,会在指令间插入内存屏障(memory barrier)。内存屏障指令会告诉编译器和cpu不管什么指令都不能和这条指令重排序。写操作后加入一条store屏障指令,会将工作内存中的共享变量强制刷新回到主内存,其余线程都可访问。读操作前加入load屏障指令,从主内存中读取共享变量。

    atomic类:底层调用unsafe类

    可见性:并发过程中,各线程对自身副本的修改可通知到其他线程

    原子性:要么全部失败,要么全部成功,执行过程中不会被干扰。

    Cas 保证一致性,并发性强

    Synchronize 加锁 保证一致性 并发性差

    Cas缺点:1.循环时间长开销大 2.只能保证一个共享变量的原子操作 3.ABA问题

    ABA问题  狸猫换太子  版本号控制

    AtomicStampReferance 用原子版本引用类  修饰共享变量。解决ABA问题。除了比较内存里的值还会比较版本号 类似乐观锁

    怎么实现原子性  CAS 思想 ,compare and swap 比较并交换。

    怎么实现?unsafe类和自旋锁。

    var1 atomicinteger对象本身

    var 2该对象值的引用地址

    var4 需要变动的数量

    var5 是通过var1和var2找出的主内存中的真实值

    如果相同 更新var5+var4并返回true

    如果不同 继续取值然后比较,直到更新完成

    Do { var5 =this.getintvolatile(var1,var2)

    }while(!this.compareandswapint(var1,var2,var5,var5+var4));

    return var5

    相关文章

      网友评论

          本文标题:CAS compare and swap  比较和交换

          本文链接:https://www.haomeiwen.com/subject/rknduktx.html