CASアルゴリズムの概要:
- CAS(Compare-And-Swap)は、同時実行性のハードウェアサポートであり、マルチプロセッサ操作用に設計され、共有データへの同時アクセスを管理するために使用されるプロセッサの特別な命令です。
- CASは、ロックフリーのノンブロッキングアルゴリズムの実装です。
- CASには3つのオペランドがあります。 新しい値Bに書き込まれる 値Aを比較
するために読み書きする必要があるメモリ値V- Vの値がAに等しい場合に限り、CASはVの値を新しい値Bでアトミックに更新します。そうでない場合、操作は実行されません。
原子変数の概要:
- 単一の変数のロックを解除するスレッドセーフなプログラミングをサポートするクラスの小さなツールキット。実際、このパッケージのクラスは、揮発性の値、フィールド、および配列要素の概念を、アトミックな条件付き更新操作も提供する概念に拡張できます。
- クラスAtomicBoolean、AtomicInteger、AtomicLong、およびAtomicReferenceのインスタンスはそれぞれ、対応する型の個々の変数へのアクセスと更新を提供します。各クラスは、そのタイプに適切なユーティリティメソッドも提供します。
- AtomicIntegerArray、AtomicLongArray、およびAtomicReferenceArrayクラスは、アトミック操作をさらに拡張して、これらのタイプの配列をサポートします。これらのクラスは、通常の配列ではサポートされていない、配列要素への揮発性アクセスのセマンティクスを提供することでも注目に値します。
コアメソッド:boolean compareAndSet(expectedValue、updateValue)
java.util.concurrent.atomicパッケージは、アトミック操作用のいくつかの一般的なクラスを提供します。
- AtomicBoolean、AtomicInteger、AtomicLong、
AtomicReference、AtomicIntegerArray、AtomicLongArray、
AtomicMarkableReference、AtomicReferenceArray、AtomicStampedReference
シミュレーション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);
}
}