Concurrent包源碼分析(二): AtomicIntegerArray和

在某些情況下,我們可能需要對一系列的整數進行線程同步的更新,則可以使用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);
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章