1. 程式人生 > 程式設計 >java併發程式設計專題(十一)----(JUC原子類)陣列型別詳解

java併發程式設計專題(十一)----(JUC原子類)陣列型別詳解

上一節我們介紹過三個基本型別的原子類,這次我們來看一下陣列型別: AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray。其中前兩個的使用方式差不多,AtomicReferenceArray因為他的引數為引用陣列,所以跟前兩個的使用方式有所不同。

1.AtomicLongArray介紹

對於AtomicLongArray,AtomicIntegerArray我們還是隻介紹一個,另一個使用方式大同小異。

我們先來看看AtomicLongArray的建構函式和方法:

建構函式:
AtomicLongArray(int length) //建立給定長度的新 AtomicLongArray。

AtomicLongArray(long[] array) //建立與給定陣列具有相同長度的新 AtomicLongArray,並從給定陣列複製其所有元素。
方法:
long addAndGet(int i,long delta) //以原子方式將給定值新增到索引 i 的元素。
boolean compareAndSet(int i,long expect,long update) //如果當前值 == 預期值,則以原子方式將該值設定為給定的更新值。
long decrementAndGet(int i) //以原子方式將索引 i 的元素減1。
long get(int i) //獲取位置 i 的當前值。
long getAndAdd(int i,long delta) //以原子方式將給定值與索引 i 的元素相加。
long getAndDecrement(int i) //以原子方式將索引 i 的元素減 1。
long getAndIncrement(int i) //以原子方式將索引 i 的元素加 1。
long getAndSet(int i,long newValue) //以原子方式將位置 i 的元素設定為給定值,並返回舊值。
long incrementAndGet(int i) // 以原子方式將索引 i 的元素加1。
void lazySet(int i,long newValue)// 最終將位置 i 的元素設定為給定值。
int length() //返回該陣列的長度。
void set(int i,long newValue) //將位置 i 的元素設定為給定值。
String toString() //返回陣列當前值的字串表示形式。

2.使用方式:

我們可以發現AtomicLongArray的使用方式和上一篇介紹的基本型別的原子類差不多,無非是換成了陣列型別,另外方法裡面的etAndAdd與ncrementAndGet我們要注意使用方式。

3.AtomicReferenceArray介紹

我們來看一下他的方法:

構造方法:

AtomicReferenceArray(E[] array) //建立與給定陣列具有相同長度的新 AtomicReferenceArray,並從給定陣列複製其所有元素。
AtomicReferenceArray(int length) // 建立給定長度的新 AtomicReferenceArray。
方法:
boolean compareAndSet(int i,E expect,E update) //如果當前值 == 預期值,則以原子方式將位置 i 的元素設定為給定的更新值。
E get(int i) //獲取位置 i 的當前值。
E getAndSet(int i,E newValue) // 以原子方式將位置 i 的元素設定為給定值,並返回舊值。
void lazySet(int i,E newValue) //最終將位置 i 的元素設定為給定值。
int length() //返回該陣列的長度。
void set(int i,E newValue) // 將位置 i 的元素設定為給定值。
String toString() //返回陣列當前值的字串表示形式。
boolean weakCompareAndSet(int i,E update) // 如果當前值 == 預期值,則以原子方式將位置 i 的元素設定為給定的更新值。

由上我們可以看到AtomicReferenceArray與前兩個的方法相比少了很多。
下面我們通過一個小例子來看一下他的使用:

public class AtomicReferenceArrayTest {
    public static void main(String[] args) {
      Long[] l = new Long[4];
      String[] s = new String[4];
      int[] i = new int[4];
      Integer[] in = new Integer[4];
      AtomicReferenceArray atomicReferenceArray = new AtomicReferenceArray(l);
      System.out.println(atomicReferenceArray.length());
      System.out.println(atomicReferenceArray.get(2));

      AtomicReferenceArray atomic = new AtomicReferenceArray(4);
      atomic.set(0,432141);
      atomic.set(2,"fsafefeq");
      atomic.set(3,i);
      System.out.println(atomic.toString());
    }
  }

輸出結果為:

exclude patterns:
4
null
[432141,null,fsafefeq,[I@357b2b99]

Process finished with exit code 0

說明:

  1. 1.當我們使用AtomicReferenceArray(E[] array)這個構造方法傳入一個數組物件時,該陣列物件必須是引用型別,int[]不可以,但是Integer[]的可以。
  2. 2.當我們使用AtomicReferenceArray(int length)這個建構函式的時候,只要為他指定了陣列大小之後,你為陣列的每一位設定什麼值是沒有要求的,類似於Map的形式。

以上就是java併發程式設計專題(十一)----(JUC原子類)陣列型別詳解的詳細內容,更多關於JAVA (JUC原子類)的陣列型別的資料請關注我們其它相關文章!