欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java并发之CAS实现原子操作原理

程序员文章站 2022-05-05 12:10:21
...

Java并发之CAS实现原子操作原理

CAS 原理

CAS:Compare and Swap,即比较再交换。

通过JDK源码理解CAS

在Java的JDK1.5就提供了java.util.concurrent.atomic包(简称源原子类包),这个包中的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。Atomic包里的类基本都是使用Unsafe实现的包装类。

接下来是AtomicInteger类中incrementAndGet()方法的源码

public final int incrementAndGet() {
	for (;;) {
		int current = get();
		int next = current + 1;
		if ( compareAndSet(current,next)) {
			return next;
		}
	}
}

public final boolean compareAndSet(int expect, int update) {
	return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

怎么实现操作的原子性呢?
在incrementAndGet()方法中current等于获取此时内存中的值,next等于要更新的值,在compareAndSet(current,next)中就是通过current与内存中的值进行对比,如果没有变化(没有被其他线程更改),则将next的值写入到内存,如果已经被其他线程更改了,则不将next的值赋给内存,然后又开始重复以上操作(通过for死循环),知道完成正确的自增,此时就会退出循环。
这里附上一张CAS加循环实现原子操作的流程图:
Java并发之CAS实现原子操作原理
这里AtomicInteger.incrementAndGet方法调用了类sun.misc.Unsafe库里面的 CAS算法,用CPU指令来实现无锁自增。所以,AtomicInteger.incrementAndGet的自增比用synchronized的锁效率倍增。