java.util.concurrent.atomic包中提供了AtomicBoolean,AtomicInteger,AtomicLong等常见类型的类,这些类通过CAS实现了原子操作,但是这些类都是只针对单一类型的单一变量保证原子操作。如果需要对多个变量同时操作,AtomicReference这个类通过指定泛型的方式可以实现对JAVA类进行原子操作。需要注意的是这些类中都存在ABA问题。
AtomicStampedReference
AtomicStampedReference其实和AtomicReference作用一致,都是用来实现JAVA对象原子操作的。
但是AtomicStampedReference解决了ABA问题,这个类的compareAndSet方法的作用是首先检查当前引用是否等于预期引用,并且检查当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。
public boolean compareAndSet(
V expectedReference, // 预期引用
V newReference, // 更新后的引用
int expectedStamp, // 预期标志
int newStamp // 更新后的标志
)
AtomicStampedReference使用示例
public static void main(String[] args) {
boolean result = CasUtil.increment();
}
public class CasUtil {
static AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference(1,1);
//自增操作
public static boolean increment() {
boolean result = atomicStampedReference.compareAndSet(atomicStampedReference.getReference(),atomicStampedReference.getReference()+1,atomicStampedReference.getStamp(),atomicStampedReference.getStamp()+1);
while(!result) {
return increment();
}
return true;
}
}