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可以更好的使用相关的标准类库。
网友评论