CAS原子操作之AtomicStampedReference

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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_29569183/article/details/113104669