之前看源代码的时候,发现了有两个方法。一个是compareAndSet,一个是compareAndSwap, 傻傻分不清这两个到底哪个是CAS呢。
我看了java并发编程实战 找到了答案。
CAS 是一种计算机的指令。
CAS包含3个操作数, 需要读写的内存位置V,进行比较的值A和拟写入的新值B。当且仅当V的值等于A时,CAS才会通过原子方式用新值B来更新V的值,否则不会执行任何操作。无论位置V的值是否等于A,都将返回V原有的值。(这种变化形式被称为比较并设置,无论操作是否成功都会返回。)CAS的含义是 我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少。
所以我们来看源代码。
1 protected final boolean compareAndSetState(int expect, int update) {
2 // See below for intrinsics setup to support this
3 return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
4 }
上面的代码是AbstractQueuedSynchronizer 这个类中的方法。
可以看到 compareAndSetState 方法相当于compareAndSet 方法,是一个api。而我们来看它的实现,发现调用unsafe类的compareAndSwapInt。这里unsafe类可以调用计算机底层的东西。
所以我们可以得出CAS 是指的 compareAndSwap方法,意思是比较并交换。
java并发编程实战中给出这样一个模拟CAS的操作的示例:
CAS的典型使用模式是: 首先从V中读取值A,并根据A计算新值B,然后再通过CAS以原子方式将V中的值由A变成B(只要在这期间没有任何线程将V的值修改为其他值)。由于CAS能检测到来自其他线程的干扰,因此即使不使用锁也能够实现原子的读 改 写操作序列。