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