カウンターとして整数を使用します。整数は増加するだけで、確かに複数のスレッドが同時に増加します。このカウンターの値は、他のスレッドがその値にアクセスしようとしないときに、プログラムの実行の最後に読み取られます。
この種類のインクリメントのみのカウンターには、ロックや同期を使用する必要がないと思います。これは正解? Javaでコーディングすると、違いが出てきます。
int
またはlong
変数を使用しただけの場合、would同期が必要です-インクリメントにはローカルでの読み取り/インクリメントが含まれます/書き込み。これは、アトミック操作とはかけ離れています。 (変数がvolatile
であっても、古さのメモリモデルの懸念を回避するために、3つの異なる操作があり、それらの任意のペアの間で横取りされる可能性があります。)
幸いなことにJavaは AtomicInteger
および AtomicLong
を提供します同期せずに使用します:
private final AtomicLong counter = new AtomicLong();
...
counter.incrementAndGet(); // No need for synchronization