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的锁效率倍增。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值