CAS的核心操作就是比较V值与A是不是一致,如果一致,则将V更新为B。如果V先被线程1更新为C,又被线程2更新为A,最后当前线程进行CAS操作时,看到V的值还是A,认为可以将V更新为B,但是某些场景下,ABA被认为是发生了变化,需要重新执行计算。
产生问题的原因:缺失足够多的信息。
解决方案:增加信息量,原来要校验并更新1个值,现在校验并更新2个值,包括原来要更新的值和一个版本号。
Java原子类库提供的AtomicStampedReference和AtomicMarkableReference。