對「長整型數組」元素進行原子操作,解決多線程環境下數組元素非線程安全問題。
AtomicLongArray(int length)、AtomicLongArray(long[] array)get(i)、set(i, val)、compareAndSet(i, expect, update)getAndIncrement(i)、incrementAndGet(i)、addAndGet(i, delta) 等int length() 獲取數組長度public final long incrementAndGet(int i) { return addAndGet(i, 1); }
public long addAndGet(int i, long delta) {
long offset = checkedByteOffset(i); // 邊界檢查 + 計算內存偏移
while (true) {
long current = getRaw(offset); // volatile 讀取
long next = current + delta;
if (compareAndSetRaw(offset, current, next)) return next; // CAS 更新
}
}
private long getRaw(long offset) { return unsafe.getLongVolatile(array, offset); }
private boolean compareAndSetRaw(long offset, long expect, long update) {
return unsafe.compareAndSwapLong(array, offset, expect, update);
}
原理:計算數組元素在內存中的偏移量,配合 Unsafe 的 getLongVolatile 和 compareAndSwapLong 實現原子讀寫。
// LongArrayTest.java
import java.util.concurrent.atomic.AtomicLongArray;
public class LongArrayTest {
public static void main(String[] args) {
long[] arr = {10, 20, 30, 40, 50};
AtomicLongArray ala = new AtomicLongArray(arr);
ala.set(0, 100);
for (int i=0;i
運行結果
get(0):100 get(1):20 get(2):30 get(3):40 get(4):50
getAndDecrement(0):100 decrementAndGet(1):19
getAndIncrement(2):30 incrementAndGet(3):41
addAndGet(0,100):199 getAndAdd(1,100):19
compareAndSet(2,31,1000):true get(2):1000