原子计数可以直接使用AtomicInteger
下面采用AtomicStampedReference的版本号控制原子操作解决ABA问题
最终结果一定最大的是200000
1A->2B->3A
public class AtomicReferenceMain {
static volatile int i=0;
private static AtomicStampedReference<Integer> asr=new AtomicStampedReference<>(i,1);
public static void main(String[] args) throws InterruptedException {
AtomicInteger a=new AtomicInteger(0);
MyRunnable mr=new MyRunnable();
List<Thread> list=new ArrayList<>(20);
for (int j=0;j<20;j++){
list.add(new Thread(mr));
}
for (Thread thread : list) {
thread.start();
}
}
private static class MyRunnable implements Runnable{
@Override
public void run() {
for (int j=0;j<10000;j++){
for (;;){
//参数:期望值,新值,期望版本号,新版本号
boolean b = asr.compareAndSet(asr.getReference(), asr.getReference()+1, asr.getStamp(), asr.getStamp() + 1);
if(b){
break;
}
}
}
System.out.println(asr.getReference());
}
}
}