概要:
數組
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); }