什么是ABA问题?
解决方案:引入原子引用,AtomicStampedReference
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicStampedReference;
public class AtomicReferenceDemo {
public static void main(String[] args) {
AtomicStampedReference<Integer> atomic = new AtomicStampedReference<Integer>(1, 1);
new Thread(()->{
int stamp = atomic.getStamp();
System.out.println("a1=>" + stamp);
//延时2秒,保证A,线程进来后取得的版本号一致
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("A------");
System.out.println(atomic.compareAndSet(1, 2, atomic.getStamp(), atomic.getStamp() + 1));
System.out.println("a2=>" + atomic.getStamp());
System.out.println("A------");
System.out.println(atomic.compareAndSet(2, 1, atomic.getStamp(), atomic.getStamp() + 1));
System.out.println("a3=>" + atomic.getStamp());
}, "a").start();
new Thread(()->{
int stamp = atomic.getStamp();
System.out.println("b1=>" + stamp);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("B------");
System.out.println(atomic.compareAndSet(1, 6, stamp, stamp + 1));
System.out.println("b2=>" + atomic.getStamp());
}, "b").start();
}
}
这里需要注意的是,对于包装类Integer有个大坑,详见阿里巴巴java开发手册: