CAS ABA问题
描述
多个线程对某一个原子类进行操作时,某个线程将原值A改成了B,又改回了A,此时另一个线程也对该值进行操作,发现值仍然是A,就会认为它没有被修改过,从而执行CAS操作,但是此时A并不是原来的A,这个就是ABA问题。
解决
使用版本号或者时间戳来表示数据的变化,JUC包中AtomicStampedReference和AtomicMarkableReference可以解决ABA问题
AtomicStampedReference类使用一个标记(stamp)来记录对象的版本号,当对象发生变化时,版本号会自动增加。通过比较对象引用和版本号来判断对象是否发生过变化,从而避免了 ABA 问题。
AtomicMarkableReference类类似于AtomicStampedReference, 但它使用一个布尔标记(mark)来表示对象的状态是否发生过改变,同样地,通过比较对象引用和标记来判断对象是否发生过变化,以避免 ABA 问题。
评论区