简述CAS

作者: 掩流年 | 来源:发表于2019-11-24 22:51 被阅读0次

    CAS是什么?

    CAS即Compare And Swap,是Java乐观锁的一种应用,常常应用在Atomic包中。

    CAS的运行机理

    CAS的运行机理如字面意思所示,比较然后转换,它指的是在一个线程改变某个共享变量的一瞬间,先和之前的值作比较,如果持有的原始值和内存中的值是相等的,就进行更改,如果不是的话,就更改失败,然后过段时间,也就是自旋一圈,再来尝试。

    可以用如下代码的方式来演示

    boolean compareAndSwap(Variable v , Object A , Object B){
        if(a==v.get()){
            v.set(B);
            return true;
        }
        return false;
    }
    

    我们可以简单的理解为CAS就相当于一个代理人,多个线程就相当于它的客户,v是一个共享变量,我们在修改一个值A->B的时候,就是需要通知代理人V来进行修改即可。

    CAS中的ABA问题

    所谓ABA问题就是当线程持有的原始值A和内存中的值作比较的时候,发现值是相等的,但是实际上,已经有别的线程执行过多轮操作,只是最终把这个值改为A了。其实大多数情况下,ABA并不会引发较大的问题。但是考虑一种情况,当在一个链表环境下,链表的值位1->2->3->4,线程A执行CAS操作把4改为8,这时候线程B执行了操作,修改链表为3->4,这时候而言,整个环境已经发生了变化。这种机理操作方式自然也是不安全的。

    解决ABA的操作是引入时间戳,只有当时间戳相等的情况下,才允许修改。

    总结

    CAS只可以保证共享变量的原子性,并不能保证共享变量的可见性,所以常常在使用的时候需要搭配volatile去使用。在实际工作中,我们并不需要直接去使用CAS,但是理解CAS可以更好的使用相关的标准类库。

    相关文章

      网友评论

          本文标题:简述CAS

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