Java並行AtomicIntegerArray類


java.util.concurrent.atomic.AtomicIntegerArray類提供了可以以原子方式讀取和寫入的底層int陣列的操作,還包含高階原子操作。 AtomicIntegerArray支援對底層int陣列變數的原子操作。 它具有獲取和設定方法,如在變數上的讀取和寫入。 也就是說,一個集合與同一變數上的任何後續get相關聯。 原子compareAndSet方法也具有這些記憶體一致性功能。

序號 方法 描述
1 public int addAndGet(int i, int delta) 原子地將給定的值新增到索引i的元素。
2 public boolean compareAndSet(int i, int expect, int update) 如果當前值==期望值,則將位置i處的元素原子設定為給定的更新值。
3 public int decrementAndGet(int i) 索引i處的元素原子並自減1
4 public int get(int i) 獲取位置i的當前值。
5 public int getAndAdd(int i, int delta) 原子地將給定的值新增到索引i的元素。
6 public int getAndDecrement(int i) 索引i處的元素原子並自減1,並返回舊值。
7 public int getAndIncrement(int i) 將位置i處的元素原子設定為給定值,並返回舊值。
8 public int getAndSet(int i, int newValue) 將位置i處的元素原子設定為給定值,並返回舊值。
9 public int incrementAndGet(int i) 在索引i處以原子方式自增元素。
10 public void lazySet(int i, int newValue) 最終將位置i處的元素設定為給定值。
11 public int length() 返回陣列的長度。
12 public void set(int i, int newValue) 將位置i處的元素設定為給定值。
13 public String toString() 返回陣列的當前值的String表示形式。
14 public boolean weakCompareAndSet(int i, int expect, int update) 如果當前值==期望值,則將位置i處的元素原子設定為給定的更新值。

範例

以下TestThread程式顯示了基於執行緒的環境中AtomicIntegerArray變數的使用。

import java.util.concurrent.atomic.AtomicIntegerArray;

public class TestThread {

   private static AtomicIntegerArray atomicIntegerArray = new AtomicIntegerArray(10);

   public static void main(final String[] arguments) throws InterruptedException {
      for (int i=0; i<atomicIntegerArray.length(); i++) {
         atomicIntegerArray.set(i, 1);
      }

      Thread t1 = new Thread(new Increment());
      Thread t2 = new Thread(new Compare());
      t1.start();
      t2.start();

      t1.join();
      t2.join();

      System.out.println("Values: ");
      for (int i=0; i<atomicIntegerArray.length(); i++) {
         System.out.print(atomicIntegerArray.get(i) + " ");
      }
   }  

   static class Increment implements Runnable {

      public void run() {
         for(int i=0; i<atomicIntegerArray.length(); i++) {
            int add = atomicIntegerArray.incrementAndGet(i);
            System.out.println("Thread " + Thread.currentThread().getId() 
               + ", index " +i + ", value: "+ add);
         }
      }
   }

   static class Compare implements Runnable {

      public void run() {
         for(int i=0; i<atomicIntegerArray.length(); i++) {
            boolean swapped = atomicIntegerArray.compareAndSet(i, 2, 3);
            if(swapped){
               System.out.println("Thread " + Thread.currentThread().getId()
                  + ", index " +i + ", value: 3");
            }
         }
      }
   }
}

這將產生以下結果 -

Thread 10, index 0, value: 2
Thread 10, index 1, value: 2
Thread 10, index 2, value: 2
Thread 11, index 0, value: 3
Thread 10, index 3, value: 2
Thread 11, index 1, value: 3
Thread 11, index 2, value: 3
Thread 10, index 4, value: 2
Thread 11, index 3, value: 3
Thread 10, index 5, value: 2
Thread 10, index 6, value: 2
Thread 11, index 4, value: 3
Thread 10, index 7, value: 2
Thread 11, index 5, value: 3
Thread 10, index 8, value: 2
Thread 11, index 6, value: 3
Thread 10, index 9, value: 2
Thread 11, index 7, value: 3
Thread 11, index 8, value: 3
Thread 11, index 9, value: 3
Values:
3 3 3 3 3 3 3 3 3 3