简述CAS

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)