目录
CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作:针对一个变量,首先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值。
CAS 虽然高效地解决了原子操作,但是还是存在一些缺陷的,主要表现在三个方面:
????????CAS算法实现一个重要前提需要取出内存中某时刻的数据,而在下一时刻比较并替换,那么在这个时间差里数据可能会发生的变化。比如,当有多个线程对一个原子类进行操作的时候,某个线程在短时间内将原子类的值A修改为B,又马上将其修改为A,此时其他线程不感知,还是会修改成功。
????????数据库有个锁称为乐观锁,是一种基于数据版本实现数据同步的机制,每次修改一次数据,版本就会进行累加。
????????同样,Java也提供了相应的原子引用类AtomicStampedReference。
public class AtomicStampedReference<V> {
????private static class Pair<T> {
????????final T reference;
????????final int stamp;
????????private Pair(T reference, int stamp) {
????????????this.reference = reference;
????????????this.stamp = stamp;
????????}
????????static <T> Pair<T> of(T reference, int stamp) {//stamp参数
????????????return new Pair<T>(reference, stamp);
????????}
????}
????...
}
????????stamp是版本参数,在开发中每次修改变量时可以通过+1保证版本唯一性。这样就可以保证每次修改后的版本也会往上递增。这就解决了ABA问题。