2011-10-04 9 views
24

私はカウンターとして整数を使用します。整数は増加するだけであり、確実に複数のスレッドがそれを同時に増加させます。このカウンタの値は、他のスレッドがその値にアクセスしようとしないときに、プログラムの実行終了時に読み込まれます。インクリメント専用カウンタの同期が必要ですか?

この種のインクリメント専用カウンタでは、ロックや同期を使用する必要はないと仮定します。これは正しいですか? 違いがあれば、Javaでコードします。

答えて

59

あなたはちょうどそのintまたはlong変数を使用した場合は、必要同期 - インクリメントが必要ではインクリメント・ローカル/遠くアトミック操作からである、読み出し/書き込み。 (変数は、古のメモリモデルの問題を避けるためにvolatileある場合でも、それらの任意のペア間の横取りである可能性と、三つの異なる操作を持っていると思います。)

幸いJavaはAtomicIntegerAtomicLong提供いかなる同期せずに使用することができます:いつものように

private final AtomicLong counter = new AtomicLong(); 

... 

counter.incrementAndGet(); // No need for synchronization 
+0

、ジョンスキートによって素晴らしい答え。 JonはJavaプログラミングに関する本も書いていましたが、私に教えてください:) 他の書籍の推薦もお待ちしております – JavaSa

+5

@ JavaSa:いいえ、私はJavaで何も書いていません。私は徹底的にジョシュブロッホ効果的なJavaをお勧めします。 –

+0

ありがとう、あなたは2005年以来Javaで新しい新しい機能をカバーするための無料の書籍の提案もありますか? Java 7とおそらくJava 8について言えます。 – JavaSa

関連する問題