AtomicStampedReference類


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章