一、背景
解决线程并发产生的问题,除了锁,volatile等关键字之外,在特定的情景下为了提高代码运行的效率,为了摆脱“锁”这个独占式的编程方式之外,还有另外一个原子类的概念。
在java.util.concurrent.atomic包下有Java提供的线程安全的原子类,比如AtomicInteger。而这些原子类就用到了CAS机制,下面我们就来了解一下 CAS机制。
二、CAS原理
原子类 线程安全 非阻塞,底层没有锁,底层实现原理为CAS无锁技术,就是比较再交换:compare and swap。
CAS包含三个参数(V,E,N)V表示要更新的变量,E表示预期值,N表示新值。
● V=需要去更新的变量(主内存的共享变量)
● E=预期值(本地内存的副本)
● N=新值
仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS返回当前V的真实值。
如果V=E(主内存的值与本地内存的值一致,说明没人修改),将V的值设置为N。
如果V不等于E(主内存的值跟本地内存的不一致),已经被修改。这样的情况下,就将E的值设置成V的值,重新刷新,再比较。看下源码,无非就是一个无限刷新,知道V和E的值一致。
在原子类中大量使用到CAS。
三、CAS运用案例
1. AtomicInteger的实现
要想实现这种自赠的效果就需要加锁,为了提高效率,这种场景下原子类型就可以胜任。
AtomicInteger ai =new AtomicInteger(1);
ai.incrementAndGet();
查看实现代码:
/*** Atomically increments by one the current value.** @return the updated value*/public final int incrementAndGet() {return U.ge