Java同時実行中の原子操作パッケージjava.util.concurrent.atomic

1392 ワード

java.util.concurrent.atomicでは同時原子操作をサポート
java.util.concurrent.atomic.AtomicStampedReference<V>;
java.util.concurrent.atomic.AtomicInteger;
java.util.concurrent.atomic.AtomicBoolean;
java.util.concurrent.atomic.AtomicIntegerArray;
java.util.concurrent.atomic.AtomicLong;
java.util.concurrent.atomic.AtomicLongArray;
java.util.concurrent.atomic.AtomicMarkableReference<V>;
java.util.concurrent.atomic.AtomicReference<V>;
java.util.concurrent.atomic.AtomicReferenceArray<E>;

AtomicIntegerを例にとると、彼の同時実現を見てみましょう.
    public final int getAndSet(int newValue) {
        for (;;) {
            int current = get();
            if (compareAndSet(current, newValue))
                return current;
        }
    }

デッドサイクルを利用してcompareAndSetを利用して原子操作を実現し、compareAndSetの実現は以下の通りである.
public final boolean compareAndSet(int expect, int update) {
	return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

我々は彼がUnsafeを借りてその原子操作を実現したことを発見し、UnsafeはCAS(compare and swap)に基づいており、CASは現代のCPUがコンカレントプログラムに提供する原語操作である.CPUによって使用仕様が異なる.Intelプロセッサでは,命令によるcmpxchgシリーズを比較し交換する.CAS操作は、メモリ位置(V)、予想値(A)、および新しい値(B)の3つの操作数を含む.JUCの中の原子類の実現はすべてCASを通じて、CASは更に効率的に機械コードの方面から同時操作を提供することができる.