在某些情况下,我们可能需要对一系列的整数进行线程同步的更新,则可以使用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);
}