多线程控制类-AtomicStampedReference原子类CAS的ABA问题以及解决

1.demo代码:
package cn.yb.thread;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.atomic.AtomicStampedReference;
/**
 * 原子类CAS的ABA问题解决
 * @author yb
 *
 */
public class ThreadABADemo {
//	static private int n;// 执行n++操作的变量
//	static AtomicInteger atomicReference;
	static AtomicStampedReference<Integer> atomicReference;

	public static void main(String[] args) throws InterruptedException {
        int j = 0;
        while(j<100) {
//        	n=0;
        atomicReference = new AtomicStampedReference(0,0);//第一个参数初始值,第二个参数时间戳
		Thread thread1 = new Thread(new Runnable() {
			public void run() {

				for (int i = 0; i < 1000; i++) {
//					n++;
					int stamp;
					Integer reference;
					do {
						stamp = atomicReference.getStamp();
						reference = atomicReference.getReference();
					}while(!atomicReference.compareAndSet(reference, reference+1, stamp, stamp+1));
				}
			}
		});
		Thread thread2 = new Thread(new Runnable() {

			public void run() {
				for (int i = 0; i < 1000; i++) {
//					n++;
					int stamp;
					Integer reference;
					do {
						stamp = atomicReference.getStamp();
						reference = atomicReference.getReference();
					}while(!atomicReference.compareAndSet(reference, reference+1, stamp, stamp+1));				}
			}
		});
		thread1.start();
		thread2.start();
		thread1.join();//线程1加入主线程
		thread2.join();//线程2加入主线程
		System.out.println("n的最终值是:"+atomicReference.getReference());
		j++;
        }	
	}
}

2.运行效果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_46266503/article/details/106985756