ソース学習【原子類AtomicInteger】Java原子類下位実装(解釈詳細)


原子類AtomicInteger
Javaでは、マルチスレッドの下でデータの安全を保証する方法がたくさんあります.AtomicXXXXこれらのクラスはその中の1つです.原子クラスは、各ステップの操作が原子操作であることを保証することができます.今回はAtomicIntegerのソースコードについて学びます.
まず、このクラスのクラス変数とメンバー変数を見てみましょう.
//    unsafe 【java            ,           。Unsafe             】
//             cpu       。
private static final Unsafe unsafe = Unsafe.getUnsafe();
//            static     ,        ,       value     AtomikInteger         ,                         。
private static final long valueOffset;

static {
    try {
        valueOffset = unsafe.objectFieldOffset
            (AtomicInteger.class.getDeclaredField("value"));
    } catch (Exception ex) { throw new Error(ex); }
}
//volatile  ,AtomicInteger  ,      ,            。
private volatile int value;

このクラスの内部の変数を見終わって、実は大体このクラスがどのように完成した原子の操作を推測することができて、volatile修飾のvalueを使って値を記憶して、すべてのスレッドがいつでも値を読むことができることを保証して、それからすべてのステップの操作はすべてCAS(compare and swap)を使ってこのようにしてずっと原子が書くことができることを保証して、次にソースコードがいったいそうであるかを見てみましょう.
incrementAndGetという方法を見てみると,実際には++iの操作であるが,原子性は保証されている.
 public final int incrementAndGet() {
    // get    +1,      unsafe     i++。 value      。
    return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}

//Unsafe  。            do-while,  CAS  (  AtomicInteger    value  ,  CAS      var5       var5+1)。
//  getIntVolatile compareAndSwapInt   native  , C  。CAS        cpu cpxchg(compare*change)。
public final int getAndAddInt(Object var1, long var2, int var4) {
    int var5;
    do {
        var5 = this.getIntVolatile(var1, var2);
    } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

    return var5;
}

まとめ
他のすべての方法は大きく異なり、volatile修飾valueを使用して値を格納し、各スレッドがいつでも値を読み取ることができることを保証し、ステップごとにCAS(compare and swap)を使用することで、原子書き込みを保証することができます.