web-dev-qa-db-ja.com

増分のみのカウンターの同期が必要ですか?

カウンターとして整数を使用します。整数は増加するだけで、確かに複数のスレッドが同時に増加します。このカウンターの値は、他のスレッドがその値にアクセスしようとしないときに、プログラムの実行の最後に読み取られます。

この種類のインクリメントのみのカウンターには、ロックや同期を使用する必要がないと思います。これは正解? Javaでコーディングすると、違いが出てきます。

30
qinsoon

intまたはlong変数を使用しただけの場合、would同期が必要です-インクリメントにはローカルでの読み取り/インクリメントが含まれます/書き込み。これは、アトミック操作とはかけ離れています。 (変数がvolatileであっても、古さのメモリモデルの懸念を回避するために、3つの異なる操作があり、それらの任意のペアの間で横取りされる可能性があります。)

幸いなことにJavaは AtomicInteger および AtomicLong を提供します同期せずに使用します:

private final AtomicLong counter = new AtomicLong();

...

counter.incrementAndGet(); // No need for synchronization
69
Jon Skeet