在某些情況下,我們可能需要對一系列的整數進行線程同步的更新,則可以使用AtomicIntegerArray類。
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final int base = unsafe.arrayBaseOffset(int[].class);
private static final int shift;
private final int[] array;
static {
int scale = unsafe.arrayIndexScale(int[].class);
if ((scale & (scale - 1)) != 0)
throw new Error("data type scale not a power of two");
shift = 31 - Integer.numberOfLeadingZeros(scale);
}
該類的成員變量和AtomicInteger相似,也是通過Unsafe類實現的原子更新,其中base代表了array數組的原始地址,而shift爲每個元素地址的偏移量,調用getAndIncrement會最終調用到unsafe的getAndAddInt方法,並利用base、shift以及索引i通過checkedByteOffset算出內存偏移地址。
public final int getAndIncrement(int i) {
return getAndAdd(i, 1);
}
public final int getAndAdd(int i, int delta) {
return unsafe.getAndAddInt(array, checkedByteOffset(i), delta);
}