在多线程环境下,相比于直接加锁,CAS性能要更好一些。但CAS里面也存在一些问题,最主要的问题其实就是ABA问题了。因为CAS需要在操作值的时候检查值有没有发生变化,没有发生变化就更新,有变化就不更新。
但是如果一个值原来是A又变成了B,然后又变成了A,使用CAS进行检查的时候就会发现它的值没有发生变化,但实际上它不仅变了,而且还变了两次。
要解决这个问题可以通过加版本号来解决,直接在变量前面加上版本号,每次变量更新的时候把版本号加一,这样ABA就会变成了1A-2B-3A,这样就能区分出来值的变化了。

从JDK1.5开始,JUC的atomic包里边提供了一个叫做AtomicStampedReference的类来解决ABA问题。AtomicStampedReference本质上就是通过版本号来解决ABA问题的。它的内部维护了一个名叫Pair的数据结构,用volatile来修饰,确保它的可见性。Pair将数据对象和版本号打包到一起进行比较,通过这种方式来解决了ABA问题。
点击关注。