JAvaマルチスレッド--AtomicLongArray


AtomicIntegerArray,AtomicLongArray,AtomicReferenceArrayの3つの配列型の原子類の原理と使い方は似ている.この章では,配列型の原子類についてAtomicLongArrayで紹介する.AtomicLongArrayの役割は「長い整形配列」を原子操作することである.
AtomicLongArrayソース分析(JDK 1.7.0_40ベース)
AtomicLongArrayの完全なソースコード
     完全なソースは、「http://www.cnblogs.com/skywang12345/p/3514604.html
 
AtomicLongArrayのコードは簡単ですが、以下ではincrementAndGet()のみを例に、AtomicLongの原理について説明します.incrementAndGet()のソースコードは次のとおりです.
public final long incrementAndGet(int i) {
    return addAndGet(i, 1);
}

:incrementAndGet()の は、long のインデックスiの を に1 し、1 の を すことです.
 
addAndGet()のソースコードは のとおりです.
public long addAndGet(int i, long delta) {
    //         
    long offset = checkedByteOffset(i);
    while (true) {
        //   long       offset     
        long current = getRaw(offset);
        //   long  
        long next = current + delta;
        //   CAS  long       offset  。
        if (compareAndSetRaw(offset, current, next))
            return next;
    }
}

:addAndGet()は、まず が を えているかどうかをチェックします. がなければ、 インデックスiの を する.そしてCAS でiの を します.
 
getRaw()ソースコードは のとおりです.
private long getRaw(long offset) {
    return unsafe.getLongVolatile(array, offset);
}

:unsafeは、Unsafe.getUnsafe()によって されるUnsafeオブジェクトです.UnsafeのCAS によりlong の を した. えばcompareAndSetRaw()はUnsafeを び すCAS であり、そのソースコードは の りである.
private boolean compareAndSetRaw(long offset, long expect, long update) {
    return unsafe.compareAndSwapLong(array, offset, expect, update);
}