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