JAvaマルチスレッド--AtomicLongArray
1729 ワード
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()のソースコードは次のとおりです.
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);
}