
CAS:Compare and Swap,即比较再交换。
jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronized同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。
CAS机制当中使用了3个基本操作数:主内存值V,旧的预期值A,要修改的新值B。
如下图
当两个线程并发修改主内存的值的时候每个线程都会经过如下过程。
注意,java中的这个cas的操作是一个原子操作,它是利用 JNI 来完成CPU 指令的操作,是c/c++实现的。
以AtomicInteger原子类的addAndGet方法为例
public final int addAndGet(int delta) {
return unsafe.getAndAddInt(this, valueOffset, delta) + delta;
}
Unsafe类中addAndGet方法实现
public final int getAndAddInt(Object o, long offset, int delta) {
int v;
//do while 自旋操作
do {
//获取AtomicInteger对象在内存中偏移量为offset处的值
v = getIntVolatile(o, offset);
} while (!compareAndSwapInt(o, offset, v, v + delta));
return v;
}
CAS虽然很高效的解决原子操作,但是CAS仍然存在三大问题:ABA问题、循环时间长开销大、只能保证一个共享变量的原子操作。
在java的java.util.concurrent包中提供了一组原子变量类。其中很多类使用了CAS操作。这些CAS操作基于Unsafe类中的native方法实现。