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();
}
}