AtomicStampedReference 类维护了一个对象的引用reference 和一个整型值stamp,这两个值可以原子性地进行更新。 AtomicStampedRederence 类的定义: public class AtomicStampedReference<V> extends Object 构造方法如下: AtomicStampedReference(V initialValue,int initialStamp) 表示使用初始值initialRef 和 初始stamp值 initialStamp对该类进行初始化。
ABA问题出现原因在于原子操作过程中没有对原子操作的过程进行管理,使用AtomicStampedReference类的stamp对原子操作过程进行标记,每一次操作增加一个版本号,用于记录原子操作的过程。 Demo 示例: public class ABAThread extends Thread{ AtomicStampedReference<Integer> asr ; public ABAThread( AtomicStampedReference<Integer> asr){ this.asr = asr; } public void run(){ asr.compareAndSet(0,1,asr.getStamp(),asr.getStamp()+1); System.out.println("已经将值由0改变为1"); asr.compareAndSet(1,0,asr.getStamp(),asr.getStamp()+1); System.out.println("已经将值有1改变为0"); } } public class NormalThread extends Thread{ AtomicStampedReference<Integer> asr; public Normal(AtomicStampedReference<Integer> asr){ this.asr = asr; } public void run(){ int stamp = asr.getStamp(); System.out.println("Normal线程的Stamp的值:"+ stamp); System.out.println("此时的stamp的值为:"+asr.getStamp()); try{ sleep(1000); }catch(InterruptedException e){ e.printStackTrace(); } //此处该原子操作已经改变了版本号, 判断条件为:false if(asr.compareAndSet(0,1,stamp,stamp+1)){ System.out.println("更新成功!"); }else{ System.out.println("更新失败"); } } } public class Index{ public static void main( String [] agrs){ AtomicStampedReference<Integer> asr = new AtomicStampedReference<Integer>(0,0); ABAThread abaThread = new ABATread(asr); NormalThread normalThread = new NormalThread(asr); normalThread.start(); abaThread.start(); } }