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);
}