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