在atomiinteger这个类中,他用cas 保证原子性问题,但同时也引发了新的问题;
ABA,一句话,狸猫换太子,举个例子,
(V,内存值,A旧的预期值,B,要求个更新值);
举例;
有两个线程,同时操作一个变量,线程1执行时间比线程2执行时间长,线程2执行快
线程1读取值,此时读到的值是A,这时候线程被挂起,
线程2也读到值,并将A修改为X,然后又做了操作,X又改为Z,最后又将Z改为A;线程2交出执行权;
线程1此时拿到执行权了,此时进行compareAndSwap,发现内存值和期望值是一样,于是正常执行,
但是内存值在这期间已经被操作过;
这就是ABA问题;
CAS cas = new CAS();
cas.setValue(5);
new Thread(new Runnable() {
@Override
public void run() {
cas.compareAndSet(5,10);
cas.compareAndSet(10,5);
}
},"t1").start();
new Thread(new Runnable() {
public void run() {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(cas.compareAndSet(5, 2333)+"\t"+cas.get());
}
},"t2").start();
CAS是 我模拟atomicIntger类写的类, 下面先看看上段代码;
假设两段线程,t1,t2, ,t1,t2都读取到内存值是5,t2让出执行权,t1先执行,执行多次,修改过内存值,但是最终值和初始内存值一样;
此时交到线程2执行,线程2执行成功;;;
这就是ABA