經過版本號解決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()); } }
運行結果以下:
這裏用休眠,讓線程1和線程2一次執行,經過結果能夠看出來,線程1執行成功,而線程2執行失敗。緣由就是由於版本號對不上。spa