Javaの並行性-AtomicLongクラス

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

AtomicLongメソッド

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

シニア番号 方法と説明
1

public long addAndGet(long delta)

指定された値を現在の値に原子的に追加します。

2

public boolean compareAndSet(long expect, long update)

現在の値が期待値と同じである場合、原子的に値を指定された更新値に設定します。

3

public long decrementAndGet()

原子的に現在の値を1つ減らします。

4

public double doubleValue()

指定された数値の値をdoubleとして返します。

5

public float floatValue()

指定された数値の値をfloatとして返します。

6

public long get()

現在の値を取得します。

7

public long getAndAdd(long delta)

指定された値を現在の値にアトミックに追加します。

8

public long getAndDecrement()

原子的に現在の値を1つ減らします。

9

public long getAndIncrement()

現在の値を1つ原子的にインクリメントします。

10

public long getAndSet(long newValue)

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

11

public long incrementAndGet()

現在の値を1つ原子的にインクリメントします。

12

public int intValue()

指定された数値の値をintとして返します。

13

public void lazySet(long newValue)

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

14

public long longValue()

指定された数値の値をlongとして返します。

15

public void set(long newValue)

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

16

public String toString()

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

17

public boolean weakCompareAndSet(long expect, long update)

現在の値が期待値と同じである場合、原子的に値を指定された更新値に設定します。

次のTestThreadプログラムは、スレッドベースの環境でAtomicLongを使用したカウンターの安全な実装を示しています。

import java.util.concurrent.atomic.AtomicLong;

public class TestThread {

   static class Counter {
      private AtomicLong c = new AtomicLong(0);

      public void increment() {
         c.getAndIncrement();
      }

      public long value() {
         return c.get();
      }
   }

   public static void main(final String[] arguments) throws InterruptedException {
      final Counter counter = new Counter();
      
      //1000 threads
      for(int i = 0; i < 1000 ; i++) {
         
         new Thread(new Runnable() {
            
            public void run() {
               counter.increment();
            }
         }).start();	
      }
      Thread.sleep(6000);			   		  
      System.out.println("Final number (should be 1000): " + counter.value());
   }
}

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

出力

Final number (should be 1000): 1000