CAS操作和ABA问题

多线程开发中,通常会加锁做并发控制,但是加锁会让性能降低,因此有了CAS操作,但CAS操作会引发ABA问题。

什么是CAS

CAS(Compare and Swap,比较和交换),是一种乐观锁(同时操作同一个对象的概率非常小,因此大部分加锁操作做的都是无用功)的实现方式,是以一种无锁的方式实现并发控制,即在多线程环境下,以不加锁的方式对数据进行修改。

CAS的操作过程

CAS(V,E,N),V表示要更新变量的值(变量当前值),E表示预期值(变量的旧值),N表示新值。

仅当 V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做更新,则当前线程则什么都不做。

最后,CAS 返回当前V的真实值。

ABA问题

ABA问题,是指CAS操作中,其它线程把变量的值进行了修改但是修改的值与原始值一致,使CAS的比较判断出错,即无法感知数据被修改过,导致程序异常。

避免方法:加入版本号进行记录,CAS操作时比较一下版本号就能判断出是不是属于自己的那次CAS操作了。