CAS

作者: 王金松 | 来源:发表于2019-04-02 13:10 被阅读0次

    CAS:Compare AND Swap
    jdk1.5之后出现的atomic类都依赖与CAS

    CAS的三个核心参数

    V:  主内存中存放,所有的线程共享
    A:上次线程从主内存中拿到的V值,放到工作线程中,放到线程的栈帧中,每个线程私有
    B:需要写入主内存并改写V的值,即最后的期望值
    

    工作流程如下

    主内存中保存V值,某个线程想要使用,首先从主内存中拿到该值并存放到工作内存中,为A,然后通过计算(比如+)得到结果B,然后在把B写回到主内存。
    CAS的核心思想是在将B值写回到主内存之前,要比较V值和A值是否一样,如果不相同的话,说明此时V值已经被其他线程改变,需要重新将V值赋予A值,然后从新计算得到B,如果相同,则将B赋予V

    CAS中的ABA问题

    如果一开始取到A值,计算得到B,赋值之前取回V与A对比发现相等,此时并不等同与V值没有被其他线程操作过,有可能是被其他线程由A改为B,然后又改回了A,此时就是ABA问题
    ABA问题一般不会影响线程操作的正确性

    ABA解决办法

    在变量前面添加版本号,每次操作都需要版本+1,ABA问题就变成了1A-2B-3A
    atomic下的AtomicStampedReference类,他的compareAndSet方法就是先检查当前引用是否一样,然后检查当前标识,全部相等,再给V赋予新值

    atomic相关类

    AtomicInteger
    AtomicLong
    AtomicBoolean
    AtomicReference(对其他类型进行封装,如果封装的是Inreger那么实际上就是AtomicInteger)

    new AtomicReference<Integer>()
    

    相关文章

      网友评论

          本文标题:CAS

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