CAS是支持并发的第一个CPU提供原子的测试并设置操作,通常在单位上运行这项操作。操作数为V,A,B。
CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。
如果内存位置的值与预期原值相匹配(V==A),那么处理器会自动将该位置值更新为新值。
否则,处理器不做任何操作。
无论哪种情况,它都会在 CAS 指令之前返回该位置的值。(在 CAS 的一些特殊情况下将仅返回 CAS 是否成功,而不提取当前值。)CAS 有效地说明了“我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置的值即可。”
CAS算法目的就是保证原子性(一个完整的操作 “读-改-写”)
计算机要修改一个值 的过程分三步:
①、首先会读取这个值到自己独立的内存中。
②、在自己独立内存中进行更新操作(修改值)。
③、然后将修改过后的值重新写入到内存中
这样是一个完整的过程。
在这个过程中如果有其它线程对上面线程要修改的值进行改操作,会导致写入的值不是正确的值。
模拟CAS算法示例:
/*
* 模拟 CAS 算法
*/
public class TestCompareAndSwap {
public static void main(String[] args) {
final CompareAndSwap cas = new CompareAndSwap();
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
int expectedValue = cas.get();
boolean b = cas.compareAndSet(expectedValue, (int)(Math.random() * 101));
System.out.println(b);
}
}).start();
}
}
}
class CompareAndSwap{
private int value;
//获取内存值
public synchronized int get(){
return value;
}
//比较
public synchronized int compareAndSwap(int expectedValue, int newValue){
int oldValue = value;
if(oldValue == expectedValue){
this.value = newValue;
}
return oldValue;
}
//设置
public synchronized boolean compareAndSet(int expectedValue, int newValue){
return expectedValue == compareAndSwap(expectedValue, newValue);
}
}