import javax.swing.plaf.PanelUI; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicStampedReference; /** * ABA问题的解决: */ public class ABADemo { static AtomicInteger atomicInteger = new AtomicInteger(100); static AtomicStampedReference atomicStampedReference = new AtomicStampedReference(100,1); public static void main(String[] args){ System.out.println("=========ABA问题产生=========="); Thread t1 = new Thread(){ @Override public void run() { atomicInteger.compareAndSet(100,101); atomicInteger.compareAndSet(101,100); } }; t1.setName("t1"); t1.start(); Thread t2 = new Thread(){ @Override public void run() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(atomicInteger.compareAndSet(100,2020) + "\t " + atomicInteger.get()); } }; t2.setName("t2"); t2.start(); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("=========ABA问题解决=========="); Thread t3 = new Thread(){ @Override public void run() { int stamp = atomicStampedReference.getStamp(); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " \t第1次版本号:" + atomicStampedReference.getStamp()); atomicStampedReference.compareAndSet(100,101, atomicStampedReference.getStamp(), atomicStampedReference.getStamp()+1); System.out.println( Thread.currentThread().getName() + "\t第2次版本号:" + atomicStampedReference.getStamp()); atomicStampedReference.compareAndSet(101,100, atomicStampedReference.getStamp(), atomicStampedReference.getStamp()+1); System.out.println(Thread.currentThread().getName() + "\t第3次版本号:" + atomicStampedReference.getStamp()); } }; t3.setName("t3"); t3.start(); Thread t4 = new Thread(){ @Override public void run() { int stamp = atomicStampedReference.getStamp(); System.out.println(Thread.currentThread().getName() + " \t第1次版本号:" + stamp); try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "修改是否成功: "+atomicStampedReference.compareAndSet(100,2009,stamp,stamp+1)); System.out.println(Thread.currentThread().getName() + "当前版本号:" + atomicStampedReference.getStamp() + "\t当前值:"+ atomicStampedReference.getReference()); } }; t4.setName("t4"); t4.start(); } }
ABA问题的解决
最新推荐文章于 2024-01-22 10:15:35 发布