CAS 看起来非常的吊,但是它仍然有缺点,最顶尖的就是 ABA 问题:在 CAS 操作的时候,其他线程将变量的值 A 改成了 B,然后又改成了 A。本线程使用期望值 A与当前变量进行比较的时候,发现A变量没有变化,于是CAS就将A值进行了交换操作。这个时候实际上A值已经被其他线程改变过,这与设计思想是不符合的。
如果只是在基本类型上是没有问题的,但如果是引用类型呢?这个对象中有多个变量,我怎么知道有没有被改过?聪明的你一定想到了,加个版本号啊。每次修改就检查版本号,如果版本号变了,说明改过。这样只要变量被某个线程修改过,该变量版本号就会递增发生操作,从而解决了ABA问题