首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java JUC 原子類:AtomicLongArray 原子長整型數組操作

     編輯:Java 相關知識

1. AtomicLongArray 簡介

對「長整型數組」元素進行原子操作,解決多線程環境下數組元素非線程安全問題。

2. 核心方法

  • 構造:AtomicLongArray(int length)、AtomicLongArray(long[] array)
  • 單元素原子操作:get(i)、set(i, val)、compareAndSet(i, expect, update)
  • 增減操作:getAndIncrement(i)、incrementAndGet(i)、addAndGet(i, delta) 等
  • int length() 獲取數組長度

3. 源碼核心:以 incrementAndGet 為例

public final long incrementAndGet(int i) { return addAndGet(i, 1); }
public long addAndGet(int i, long delta) {
    long offset = checkedByteOffset(i); // 邊界檢查 + 計算內存偏移
    while (true) {
        long current = getRaw(offset);           // volatile 讀取
        long next = current + delta;
        if (compareAndSetRaw(offset, current, next)) return next; // CAS 更新
    }
}
private long getRaw(long offset) { return unsafe.getLongVolatile(array, offset); }
private boolean compareAndSetRaw(long offset, long expect, long update) {
    return unsafe.compareAndSwapLong(array, offset, expect, update);
}

原理:計算數組元素在內存中的偏移量,配合 Unsafe 的 getLongVolatile 和 compareAndSwapLong 實現原子讀寫。

4. 完整示例與輸出

// LongArrayTest.java
import java.util.concurrent.atomic.AtomicLongArray;
public class LongArrayTest {
    public static void main(String[] args) {
        long[] arr = {10, 20, 30, 40, 50};
        AtomicLongArray ala = new AtomicLongArray(arr);
        ala.set(0, 100);
        for (int i=0;i

運行結果

get(0):100 get(1):20 get(2):30 get(3):40 get(4):50
getAndDecrement(0):100 decrementAndGet(1):19
getAndIncrement(2):30 incrementAndGet(3):41
addAndGet(0,100):199 getAndAdd(1,100):19
compareAndSet(2,31,1000):true get(2):1000
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved