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

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加循环实现原子操作的流程图:
CAS
这里AtomicInteger.incrementAndGet方法调用了类sun.misc.Unsafe库里面的 CAS算法,用CPU指令来实现无锁自增。所以,AtomicInteger.incrementAndGet的自增比用synchronized的锁效率倍增。

发布了14 篇原创文章 · 获赞 15 · 访问量 529

猜你喜欢

转载自blog.csdn.net/CodingNO1/article/details/104259020
今日推荐