CAS, 在 Java 并发应用中通常指 CompareAndSwap, 即比较并交换.
CAS 是一个原子操作, 它比较一个内存位置的值并且只有相等时修改这个内存位置的值为新的值, 保证了新的值总是基于最新的信息计算的, 如果有其他线程在这期间修改了这个值则 CAS 失败.
synchronized 属于重量级锁, 很多时候会引起性能问题.
volatile 是轻量级锁, 但是 volatile 不能保证原子性.
像 synchronized 这种独占锁属于悲观锁, 它是在假设一定会发生冲突的, 那么加锁恰好有用.
除此之外, 还有乐观锁, 乐观锁的含义就是假设没有发生冲突, 那么我正好可以进行某项操作, 如果要是发生冲突呢, 那我就重试直到成功.
乐观锁最常见的就是 CAS. 我们在读 Concurrent 包下的类的源码时, 发现无论是 ReenterLock 内部的 AQS, 还是各种 Atomic 开头的原子类, 内部都应用到了 CAS.
- public class Test {
- public AtomicInteger i;
- public void add() { i.getAndIncrement();
- }
- }
- public final int getAndIncrement() {
- return unsafe.getAndAddInt(this, valueOffset, 1);
- }
- public final int getAndAddInt(Object var1, long var2, int var4) {
- int var5;
- do {
- var5 = this.getIntVolatile(var1, var2);
- } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
- return var5;
- }
- var5 = this.getIntVolatile(var1, var2);
var2 是在内存中的偏移地址, 通过这个地址拿到对象 var1 在内存中的值, 赋给 var5
然后比较 var5 是否跟对象 var1 在内存中的值相等, 如果相等, 则将这个值更新, 如果不相等, 则重试.
CAS 是在 JNI 里是借助于一个 CPU 指令完成的, 所以还是原子操作.
来源: http://www.bubuko.com/infodetail-2665688.html