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