Javaの並行性-AtomicReferenceクラス

java.util.concurrent.atomic.AtomicReferenceクラスは、アトミックに読み書きできる基礎となるオブジェクト参照に対する操作を提供し、高度なアトミック操作も含みます。AtomicReferenceは、基になるオブジェクト参照変数に対するアトミック操作をサポートします。揮発性変数の読み取りと書き込みのように機能するgetメソッドとsetメソッドがあります。つまり、セットには、同じ変数に対する後続のgetとの発生前の関係があります。アトミックcompareAndSetメソッドには、これらのメモリ整合性機能もあります。

AtomicReferenceメソッド

以下は、AtomicReferenceクラスで使用可能な重要なメソッドのリストです。

シニア番号 方法と説明
1

public boolean compareAndSet(V expect, V update)

現在の値==期待値の場合、原子的に値を指定された更新値に設定します。

2

public boolean get()

現在の値を返します。

3

public boolean getAndSet(V newValue)

原子的に指定された値に設定され、前の値を返します。

4

public void lazySet(V newValue)

最終的には指定された値に設定されます。

5

public void set(V newValue)

無条件に指定された値に設定します。

6

public String toString()

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

7

public boolean weakCompareAndSet(V expect, V update)

現在の値==期待値の場合、原子的に値を指定された更新値に設定します。

次のTestThreadプログラムは、スレッドベースの環境でのAtomicReference変数の使用法を示しています。

import java.util.concurrent.atomic.AtomicReference;

public class TestThread {
   private static String message = "hello";
   private static AtomicReference<String> atomicReference;

   public static void main(final String[] arguments) throws InterruptedException {
      atomicReference = new AtomicReference<String>(message);
      
      new Thread("Thread 1") {
         
         public void run() {
            atomicReference.compareAndSet(message, "Thread 1");
            message = message.concat("-Thread 1!");
         };
      }.start();

      System.out.println("Message is: " + message);
      System.out.println("Atomic Reference of Message is: " + atomicReference.get());
   }
}

これにより、次の結果が得られます。

出力

Message is: hello
Atomic Reference of Message is: Thread 1