CAS的英文为Compare and Swap 翻译为比较并交换。
CAS加volatile关键字是实现并发包的基石。没有CAS就不会有并发包,synchronized是一种独占锁、悲观锁,java.util.concurrent中借助了CAS指令实现了一种区别于synchronized的一种乐观锁。
使用方法:
AtomicInteger a = new AtomicInteger(1);
a.getAndIncrement();
我们进入getAndIncrement方法:
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
可以看到,是一个getAndAddInt,包括三个参数,this代表的是本对象(也就是Integer的1),valueoffset代表的是地址偏移量,也就是地址值,最后那个1表示的就是++的1。
然后进入getAndAddInt方法:
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;
}
var1:对象
var2:地址
var4:要加的数字。
首先从内存中拿出var2的值,也就是var5。
在没有问题的情况下,var5应该和var1相等。
此时进入下一步CAS环节,var1会和var5比较是否相等,如果相等就离开循环并将var5变成var5+var4,如果不相等,就会一直循环下去。
最终返回了var5。
(此外还有一个)
解决方案:AtomicStampedReference,该类创建的原子对象会加一个时间戳,也就是版本号,来确认是否会发生ABA问题。