Javaの並行性-AtomicBooleanクラス
java.util.concurrent.atomic.AtomicBooleanクラスは、アトミックに読み書きできる基になるブール値に対する操作を提供し、高度なアトミック操作も含みます。AtomicBooleanは、基になるブール変数に対するアトミック操作をサポートします。揮発性変数の読み取りと書き込みのように機能するgetメソッドとsetメソッドがあります。つまり、セットには、同じ変数に対する後続のgetとの発生前の関係があります。アトミックcompareAndSetメソッドには、これらのメモリ整合性機能もあります。
AtomicBooleanメソッド
以下は、AtomicBooleanクラスで使用可能な重要なメソッドのリストです。
シニア番号 | 方法と説明 |
---|---|
1 | public boolean compareAndSet(boolean expect, boolean update) 現在の値==期待値の場合、原子的に値を指定された更新値に設定します。 |
2 | public boolean get() 現在の値を返します。 |
3 | public boolean getAndSet(boolean newValue) 原子的に指定された値に設定され、前の値を返します。 |
4 | public void lazySet(boolean newValue) 最終的には指定された値に設定されます。 |
5 | public void set(boolean newValue) 無条件に指定された値に設定します。 |
6 | public String toString() 現在の値の文字列表現を返します。 |
7 | public boolean weakCompareAndSet(boolean expect, boolean update) 現在の値==期待値の場合、原子的に値を指定された更新値に設定します。 |
例
次のTestThreadプログラムは、スレッドベースの環境でのAtomicBoolean変数の使用法を示しています。
import java.util.concurrent.atomic.AtomicBoolean;
public class TestThread {
public static void main(final String[] arguments) throws InterruptedException {
final AtomicBoolean atomicBoolean = new AtomicBoolean(false);
new Thread("Thread 1") {
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName()
+" Waiting for Thread 2 to set Atomic variable to true. Current value is "
+ atomicBoolean.get());
if(atomicBoolean.compareAndSet(true, false)) {
System.out.println("Done!");
break;
}
}
};
}.start();
new Thread("Thread 2") {
public void run() {
System.out.println(Thread.currentThread().getName() +
", Atomic Variable: " +atomicBoolean.get());
System.out.println(Thread.currentThread().getName() +
" is setting the variable to true ");
atomicBoolean.set(true);
System.out.println(Thread.currentThread().getName() +
", Atomic Variable: " +atomicBoolean.get());
};
}.start();
}
}
これにより、次の結果が得られます。
出力
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 2, Atomic Variable: false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 2 is setting the variable to true
Thread 2, Atomic Variable: true
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Done!