JUC原子類3-AtomicLongArray原子類

概要:
數組

AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray這三個數組類型的原子類的原理和用法類似。本文章以AtomicLongArray對數組類型的原子類進行介紹。
函數

AtomicLongArray介紹和函數列表spa

AtomicLongArray的做用是對「長整型數組」進行原子操做。code

函數列表:對象

 

// 建立給定長度的新 AtomicLongArray。
AtomicLongArray(int length)
// 建立與給定數組具備相同長度的新 AtomicLongArray,並從給定數組複製其全部元素。
AtomicLongArray(long[] array)

// 以原子方式將給定值添加到索引 i 的元素。
long addAndGet(int i, long delta)
// 若是當前值 == 預期值,則以原子方式將該值設置爲給定的更新值。
boolean compareAndSet(int i, long expect, long update)
// 以原子方式將索引 i 的元素減1。
long decrementAndGet(int i)
// 獲取位置 i 的當前值。
long get(int i)
// 以原子方式將給定值與索引 i 的元素相加。
long getAndAdd(int i, long delta)
// 以原子方式將索引 i 的元素減 1。
long getAndDecrement(int i)
// 以原子方式將索引 i 的元素加 1。
long getAndIncrement(int i)
// 以原子方式將位置 i 的元素設置爲給定值,並返回舊值。
long getAndSet(int i, long newValue)
// 以原子方式將索引 i 的元素加1。
long incrementAndGet(int i)
// 最終將位置 i 的元素設置爲給定值。
void lazySet(int i, long newValue)
// 返回該數組的長度。
int length()
// 將位置 i 的元素設置爲給定值。
void set(int i, long newValue)
// 返回數組當前值的字符串表示形式。
String toString()
// 若是當前值 == 預期值,則以原子方式將該值設置爲給定的更新值。
boolean    weakCompareAndSet(int i, long expect, long update)

 

incrementAndGet()的源碼以下:blog

public final long incrementAndGet(int i) {
    return addAndGet(i, 1);
}

說明:做用是以原子方式將long數組的索引i的元素加一,並返回加一以後的值索引

addAndGet()的源碼以下:rem

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()的源碼以下:get

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);
}
相關文章
相關標籤/搜索