什么是cas?
cas 的全称即是 Compare And Swap ,是具有原子性的。通俗的理解就是cup的一条并发指令。
cas操作是一种无锁操作,是在多线程下,当有线程访问一个共享资源时,要确定当前该资源是否有其他线程占用,并会自旋获取共享资源。
基本原理
cas的实现是基于Unsafe类中的CAS方法的调用,通过jvm实现汇编指令。
cas思想–代码实现
public CAS{
private volatile int value;
public void cas(int index, int res) {
while (true) {
int prev = index;
int next = res;
if (CasSame(prev)) {
this.value = next;
}
}
}
public boolean CasSame(int k) {
return k == value;
}
}
解读:
cas方法实际index 指的是我们要修改的值,而CAS类中的value是多线程操作下,该变量现在实际的值,index是指当前线程value的值。第二个res即指的是我们需要保存的值。
CasSame方法对应就是判断多线程情况下value,与该当前线程的值是否一样。若一样则可以更改其值。否则自旋,不断循环。
cas的弊端:
- ABA问题
-------从上面我的代码大致的实现cas操作,可以看出我们只是判断出其值是否为index==value,然后对其修改。这就引出了我们都在讲的ABA问题,对于value的值我们不确定是否修改为其他值,而后又修改回来。 - 循环时间不确定
-------可以看出我们是一直循环等待值相等的时候才进行退出循环,此时一直在不断消耗cpu资源。 - 只能保证一个变量的原子性
-------从上面的代码可以看出我们只能保证value的原子性,要对多变量就要实现更多方法来保证,这样一来就不是cas操作了,毕竟是基于硬件实现的功能。
这就是小编最近学习并发编程对于cas的一个理解,如果大家觉得那个地方不对,欢迎评论!