Java並行AtomicLongArray類


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

AtomicLongArray類中方法

以下是AtomicLongArray類中可用的重要方法的列表。

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

範例

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

import java.util.concurrent.atomic.AtomicLongArray;

public class TestThread {

   private static AtomicLongArray atomicLongArray = new AtomicLongArray(10);

   public static void main(final String[] arguments) throws InterruptedException {
      for (int i=0; i<atomicLongArray.length(); i++) {
         atomicLongArray.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<atomicLongArray.length(); i++) {
         System.out.print(atomicLongArray.get(i) + " ");
      }
   }  

   static class Increment implements Runnable {

      public void run() {
         for(int i=0; i<atomicLongArray.length(); i++) {
            long add = atomicLongArray.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<atomicLongArray.length(); i++) {
            boolean swapped = atomicLongArray.compareAndSet(i, 2, 3);
            if(swapped){
               System.out.println("Thread " + Thread.currentThread().getId()
                  + ", index " +i + ", value: 3");
            }
         }
      }
   }
}

這將產生以下結果 -

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