CAS:compare and swap,典型的无锁非阻塞算法的实现。
对共享变量进行同步最常用的方法就是加锁,但是有些情况下锁的竞争非常激烈,对锁的竞争的资源消耗比业务操作的资源消耗还要大,比如说自增自减等的操作;同时线程阻塞可能也会降低吞吐量。这时候还有一种选择就是无锁非阻塞算法。
现在的处理器最常用的方法是实现名为“比较并交换(Compare And Swap)”或 CAS 的原语。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。
<span style="font-size:18px;">public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Test test = new Test();
SimulatedCAS cas = new SimulatedCAS();
cas.setOldValue(5);
test.setValue(cas);
test.increment();
}
private SimulatedCAS value;
public void setValue(SimulatedCAS value) {
this.value = value;
}
public int increment() {
int oldValue = value.getOldValue();
while (!(value.compareAndSwap(oldValue,oldValue + 1)))
oldValue = value.getOldValue(); //需要重新从老值的地址取一遍值
return oldValue + 1;
}
}
/**
* 用synchronized模拟cup的compare and swap
* @author cuihd
*
*/
class SimulatedCAS {
private int oldValue;
public int getOldValue() {
return oldValue;
}
public void setOldValue(int oldValue) {
this.oldValue = oldValue;
}
/**
* 如果老值和预期期望的老值不一样,那么返回false
* @param expectedValue
* @param newValue
* @return
*/
public synchronized boolean compareAndSwap(int expectedValue, int newValue) {
if (oldValue == expectedValue) {
oldValue = newValue;
return true;
} else {
return false;
}
}
}</span>