CASは、同時実行をサポートするために、通常はオペレーティングユニット上で実行アトミックテストとセットの操作を、提供する最初のCPUを。オペランドV、A、Bです。
CAS操作は3つのオペランド含む - メモリ位置(V)を、元の値(A)と新たな値(B)と期待されます。
元の値のメモリ位置は、期待値(V == A)と一致する場合、プロセッサは、自動的に新しい値の位置の値を更新します。
そうでない場合、プロセッサは何もしません。
いずれの場合も、CAS命令前の位置の値を返します。(いくつかの特殊なケースでCAS CASは、現在の値を抽出することなく、成功した場合にのみ返されます。)CASが効果的に、私は場所が値V Aが含まれているべきだと思う」、説明;この値が含まれている場合、この位置にあるBプットを、それ以外の場合は、場所を変更していない、あなただけの私にこの位置の値を伝えることができます。」
CASアルゴリズムが目指すアトミック性を確保することである(完全なオペレーティング「は読み - 変更 - 書き込み」)
コンピュータは、3段階のプロセスの値を変更するには:
①、それは自分の別のメモリにこの値を読み取ります。
②、それ自身の別個のメモリ内の更新動作(値を変更します)。
③、メモリ内の書き換え後に、次に変更された値
これは完全なプロセスです。
あなたが値に変更操作を変更するスレッドの上に他のスレッドがある場合は、このプロセスでは、それが正しい値につながる書かれていません。
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);
}
}