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