35679


以下のコードのようにAtomicBooleanというクラスがありますがこれは「Boolean flg =
true;」というものとどう違い、どう使い分けるのでしょうか。

[code]

    AtomicInteger count = new AtomicInteger();
    AtomicBoolean flg =new AtomicBoolean();
    flg.set(true);
    System.out.println(count.get());
    System.out.println(flg.get());
    
[/code]


CC BY-SA 3.0
2017-06-17T16:01:30.297
35667
2017-06-18T05:53:54.577
17348
question
java
クラス AtomicBooleanについて。


スレッドセーフであるかどうかに違いがあります。マルチスレッドでの動作を考慮する必要があれば、`AtomicBoolean`を使います。


CC BY-SA 3.0
2017-06-18T01:26:54.507
35673
2017-06-18T01:26:54.507
21092
35667
answer


簡単に言えば
`AtomicBoolean`＝「複数スレッドから安全に同時アクセスできる`boolean`型」です。質問中コードのように単一スレッドからしかアクセスしない場合には、ソースコード記述が面倒になるだけで、全くメリットがありません。

スレッドセーフの観点から、3種類の選択肢があります：

  * `boolean`型：複数スレッドから安全に同時アクセスすることはできません。マルチスレッド処理中から安全にアクセスするには`synchronized`文などで排他制御が必要です。`Boolean`クラスは、このプリミティブ型`boolean`に対応します。
  * `volatile boolean`型： **単純な代入と値の読取りに限定して** 、複数スレッドから安全にアクセスできます。（念のため; この性質はJava 5以降でのみ保証されます。）
  * `AtomicBoolean`クラス：提供されるインスタンスメソッドを通して、単純代入(`set`)や値の読取り(`get`)のほか、"値比較してから更新(`compareAndSet`)"といった処理を複数スレッドから安全に行えます。

* * *

[Javaリファレンスマニュアル](https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html)
にも説明があります。

>
> 原子的な更新が可能な`boolean`値です。原子変数のプロパティの詳細は、`java.util.concurrent.atomic`パッケージ仕様を参照してください。`AtomicBoolean`は、原子的に更新されるフラグなどのアプリケーションで使用されます。これを`Boolean`の代替として使用することはできません。


CC BY-SA 3.0
2017-06-18T05:45:41.093
35679
2017-06-18T05:53:54.577
2017-06-18T05:53:54.577
49
49
35667
answer