CAS算法思想:
三个参数,一个当前内存的值V、旧的预期值A、即将更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。
CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。
简单C实现:
int compare_and_swap (int* reg, int oldval, int newval)
{
ATOMIC();//代表原子操作
int old_reg_val = *reg;
if (old_reg_val == oldval)
*reg = newval;
END_ATOMIC();
return old_reg_val;
}
在实际使用时,往往配合循环使用,实现乐观锁思想
int * reg;//此为需要修改的内存地址
int new_value;//此为需要将内存中的值更新为这个值
do{
int old = *reg;//取得当前时刻内存地址中的值
}while(old != compare_and_swap(reg,old,new_value))
如果在调用方法内部,取得内存中实际的值时,旧的值和我们在循环中备份的旧值不同,也就意味着有其他线程修改了该内存值,所以返回的旧值一定和我们备份的旧值不同,继续循环