AtomicIntegerと比較操作

V1666:

私はロックとしてのAtomicInteger変数を使用しようとしています。だから、コードは以下の投稿場合は不思議と、スレッドセーフです。私はincrementAndGet()はアトミック操作です知っています。しかし、私はそれ以降は「==」操作が(値が、私は比較を行う時点で、2に増分されますどのような場合。)だけでなく、原子だろうかはわかりません。だから、自分の考えを聞くために、この質問を投稿。

private AtomicInteger count = new AtomicInteger(0); //Shared variable
private final int max = 1;

if(count.incrementAndGet() == max) {
  //Do something
}
ステファン:

以来、incrementAndGet()アトミック操作であり、多くても1つのスレッドが取得する1(限りのAtomicIntegerが1よりも低い値に設定されていないような)結果のため。これは、のAtomicIntegerによって保証されています。実際の比較であるがないこのアトミック操作の一部、受信された唯一のスレッドが1に実行されるifブロック。これは、比較は型の2つの値を比較しているためだint結果:incrementAndGet())とmaxプリミティブは以来のAtomicIntegerはそれで役割を果たしていないintときの内部状態、それの値を変更しないcount変更を。TL; DR:あなたのコードは同等です:

final int val = count.incrementAndGet(); // (it makes no difference if val is not 'final`)
if (val == max) {
    // ...
}

Javaはスレッドの安全性を達成するために、他の多くの方法を提供し(ロックたCountDownLatchセマフォ、...)、しかし、あなたはのAtomicIntegerに言及されているので、私は信じてAtomicInteger.compareAndSetは()あなたが求めていたものに、より正確です。

if (count.compareAndSet(0, 1)) {
    // executed if count == 0
    count.set(0);
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=212820&siteId=1