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))
如果在调用方法内部,取得内存中实际的值时,旧的值和我们在循环中备份的旧值不同,也就意味着有其他线程修改了该内存值,所以返回的旧值一定和我们备份的旧值不同,继续循环

CAS(Compare and Swap)是一种乐观锁技术,通过CPU指令保证原子性。当预期值与内存值相同时更新值,否则不做操作。JVM从JDK1.5开始提供底层支持,但在高并发场景下可能存在ABA问题和效率挑战。解决方案包括使用带有版本控制的原子引用类。
最低0.47元/天 解锁文章
204

被折叠的 条评论
为什么被折叠?



