CAS的ABA问题
1.什么是ABA问题
CAS算法实现的一个重要前提就是需要取出内存中的某时刻的数据并在当前时刻比较并替换,那么在这个时间差之内会导致数据的变化。
例如有一个线程T1从内存地址X中取出A,这时另一个线程T2也从内存地址X中取出A,并且线程T2进行了一系列操作将值改变成B,写回主物理内存。然后线程T2又将内存地址为X的数据变为A,这个时候线程T1进行了CAS操作发现内存中仍然是A,这时线程T1进行CAS操作成功。尽管线程T1的CAS操作成功,但并不代表这个过程就没有问题,这就是ABA问题。
2.如何解决ABA问题
(1).原子引用–AtomicReference
package com.example.demo;
import jdk.nashorn.internal.objects.annotations.Getter;
import java.util.concurrent.atomic.AtomicReference;
/**
* Created by Administrator on 2020/7/4.
*
* @author qtx
*/
class People {
String userName;
int age;
public People() {
}
public People(String userName, int age) {
this.userName = userName;
this.age = age;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "People{" +
"userName='" + userName + '\'' +
", age=" + age +
'}';
}
}
/**
* @author qtx
*/
public class AtomicReferenceDemo {
public static v