介绍
Compare And Swap,比较并交换,是无锁的实现方式之一。在比较前通过比较共享资源的当前值与旧值,来判断是否有线程已经对共享资源进行了修改,如果没有线程进行修改,就进行更新值,如果有线程进行了修改,则放弃
实现
使用CAS实现下原子类的自增功能
package cn.zjm404.stu.thread.lock.cas;
public class CASDemo {
/**
* 共享资源
*/
private volatile int count;
public CASDemo(int _count){
this.count = _count;
}
private synchronized int cas(int expect,int newValue){
int curValue = count;
//未有线程修改共享资源,进行更新
if(curValue == expect){
count = newValue;
}
//返回修改前的当前值,用于判断是否进行了更新
return curValue;
}
public int increaseAndGet(){
int newValue;
//未修改成功则进行自旋
do{
newValue = count+1;
}while(count != cas(count,newValue));
return count;
}
}
ABA问题
就如名字,共享资源原值为 A,在进行修改前,被其他线程修改为了 B ,然后又修改为了 A,当进行检查时,当前值与旧值相同,但是共享资源其实已经进行了修改。解决方式是使用一个变量记录修改次数,每进行一次修改就 +1,进行修改时判断当前修改次数是否与进入修改时的次数一样,如果不一样,则说明有其他线程对共享资源进行了修改