Atomicstampedreference的使用(如何解决aba问题)
public class AtomicstampedreferenceTest {
public static void main(String[] args){
AtomicStampedReference<Integer> reference=new AtomicStampedReference<>(1,1);
new Thread(new Runnable() {
@Override
public void run() {
int[] holder=new int[1];
Integer old= reference.get(holder);// 同时获取时间戳和数据,防止获取到数据和版本不是一致的
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(
reference.compareAndSet(old,old+1,holder[0],holder[0]+1)
);
}
}).start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//产生aba问题
reference.compareAndSet(1,2,1,2);
reference.compareAndSet(2,1,2,3);
}
}
下面是一个错误的写法
Integer old=reference.getReference();//当执行完这一行,时间片分配给别的线程,别人执行完aba
int oldVersion=reference.getStamp();//别人执行完aba,现在拿到的这个version已经是最新的
reference.compareAndSet(old,old+1,oldVersion,oldVersion+1);