package cn.bikan8;
import java.util.concurrent.atomic.AtomicStampedReference;
/**
* @Author 小浩
* @Date 2020/6/9 10:47
* @Version 1.0
* 模拟用AtomicStampedReference 解决CAS ABA问题
**/
public class Task {
private static AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<>(0, 0);
public static void main(String[] args) throws Exception{
Thread thread1 = new Thread() {
@Override
public void run() {
int stamp = atomicStampedReference.getStamp();
Integer reference = atomicStampedReference.getReference();
Boolean result = atomicStampedReference.compareAndSet(reference, reference + 1, stamp, stamp + 1);
System.out.println("当前值" + stamp + " 当前版本" + stamp +" CAS结果"+result);
}
};
// 故意给一个错误的版本号,
Thread thread2 = new Thread() {
@Override
public void run() {
int stamp = atomicStampedReference.getStamp();
Integer reference = atomicStampedReference.getReference();
Boolean result = atomicStampedReference.compareAndSet(reference, reference + 1, 0, stamp + 1);
System.out.println("当前值" + stamp + " 当前版本" + stamp +" CAS结果"+result);
}
};
thread1.start();
thread1.join();
thread2.start();
thread2.join();
}
}
加一个自增的版本号就可以解决这个问题
© 版权声明
必看吧所有博客文章均由小浩原创,转载请保留必看吧版权!
THE END
喜欢就支持以下吧
42131879月前0
补充一点,ForkJionPoo默认启动的线程数是逻辑内核数,比如我的i5 6代 就是4 ,这时候基本涉及不到线程之间的切换,也就涉及不到上下文切换。