具体的ABA产生的理论问题我就不阐述了。
实例:
public class ABADemo {
static AtomicReference<Integer> atomicReference = new AtomicReference<>(100);
static AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<>(100,1);
public static void main(String[] args) {
System.out.println("************ABA问题的产生*************");
new Thread(()->{
atomicReference.compareAndSet(100,101);
atomicReference.compareAndSet(101,100);
},"t1").start();
new Thread(()->{
//暂停1秒。保证t1线程已经完成ABA问题
try {
TimeUnit.SECONDS.sleep(1);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(atomicReference.compareAndSet(100,2019)+"\t"+atomicReference.get());
},"t2").start();
//暂停一会线程
try {
TimeUnit.SECONDS.sleep(2);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("************ABA问题的解决*************");
new Thread(()->{
int atom =atomicStampedReference.getStamp();
System.out.println(Thread.currentThread().getName()+"\t 第一次的版本号" +atom);
try {
TimeUnit.SECONDS.sleep(1);
}catch (InterruptedException e){
e.printStackTrace();
}
atomicStampedReference.compareAndSet(100,101,atomicStampedReference.getStamp(),atomicStampedReference.getStamp()+1);
System.out.println(Thread.currentThread().getName()+"\t 第二次的版本号" +atomicStampedReference.getStamp());
atomicStampedReference.compareAndSet(101,100,atomicStampedReference.getStamp(),atomicStampedReference.getStamp()+1);
System.out.println(Thread.currentThread().getName()+"\t 第三次的版本号" +atomicStampedReference.getStamp());
},"t3").start();
new Thread(()->{
int atom =atomicStampedReference.getStamp();
System.out.println(Thread.currentThread().getName()+"\t 第一次的版本号" +atom);
try {
TimeUnit.SECONDS.sleep(3);
}catch (InterruptedException e){
e.printStackTrace();
}
boolean result = atomicStampedReference.compareAndSet(100,2020,atom,atom+1);
System.out.println(Thread.currentThread().getName()+"\t 修改是否成功" +result+atomicStampedReference.getStamp());
System.out.println(Thread.currentThread().getName()+"\t 当前最新值" +atomicStampedReference.getReference());
},"t4").start();
}
}