java併發編程學習之cas-AtomicStampedReference(三)

做用

經過版本號解決ABA的問題。ide

示例

public class AtomicStampedReferenceDemo {
    static AtomicStampedReference<Integer> stampedReference = new AtomicStampedReference<>(1, 1);

    public static void main(String[] args) throws InterruptedException {
        int oldStamp = stampedReference.getStamp();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                boolean result = stampedReference.compareAndSet(1, 2, oldStamp, oldStamp + 1);
                System.out.println("當前值:1,預設2,當前版本號:" + stampedReference.getStamp() + ",結果:" + result);
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                boolean result = stampedReference.compareAndSet(2, 3, oldStamp, oldStamp + 1);
                System.out.println("當前值:2,預設3,當前版本號:" + stampedReference.getStamp() + ",結果:" + result);
            }
        });
        thread1.start();
        thread2.start();
        Thread.sleep(2000);
        System.out.println("當前值:" + stampedReference.getReference() + ",當前版本號:" + stampedReference.getStamp());
    }
}

運行結果以下:
clipboard.png
這裏用休眠,讓線程1和線程2一次執行,經過結果能夠看出來,線程1執行成功,而線程2執行失敗。緣由就是由於版本號對不上。spa

相關文章
相關標籤/搜索