Javaの並行性-AtomicLongArrayクラス

java.util.concurrent.atomic.AtomicLongArrayクラスは、アトミックに読み書きできる基になる長い配列に対する操作を提供し、高度なアトミック操作も含みます。AtomicLongArrayは、基になる長い配列変数に対するアトミック操作をサポートします。揮発性変数の読み取りと書き込みのように機能するgetメソッドとsetメソッドがあります。つまり、セットには、同じ変数に対する後続のgetとの発生前の関係があります。アトミック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の要素を1つ原子的にインクリメントします。

8

public long getAndSet(int i, long newValue)

位置iの要素を指定された値に原子的に設定し、古い値を返します。

9

public long incrementAndGet(int i)

インデックスiの要素を1つ原子的にインクリメントします。

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()

配列の現在の値の文字列表現を返します。

14

public boolean weakCompareAndSet(int i, long 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