私のプロジェクトでは、今までCyclicBarrier
を使用して複数のスレッド(それぞれが同じタイプのRunnable
を実行中)を「同期」させています。私の場合、CyclicBarrier
を使用すると同期の頻度が高いため非効率であることが判明しましたが、ビジー待機メカニズムがより速く動作する可能性があります。ここでは(いくつかの部分が出て左)私がこれまでに得たものです:Java - ビジー待機機構を実装する
public class MyRunnable implements Runnable {
private static AtomicInteger counter = null; // initialized to the number
// of threads
public void run() {
// do work up to a "common point"
synchronized (this) {
// decrement the counter and - if necessary - reset it
if (counter.decrementAndGet() == 0) {
counter.set(numberOfThreads);
// make all the busy waiting threads exit from the loop
for (int i = 0; i < threads.length; i++)
threads[i].interrupt();
}
}
// busy wait until all threads have reached the "common point"
while (!Thread.interrupted()) {}
}
}
残念ながら、このコードはCyclicBarrier
よりもさらに悪い行います。 Here's短いコンパイル可能な例。どのようにそれを改善するための任意の提案?
これらは、コードレビュー(http://codereview.stackexchange.com/)に最適な質問のようですが、そこを尋ねてみましたか? –
AtomicIntegerを使用してスレッドオブジェクトitslefで同期する場合、なぜsynchronizedブロックが必要ですか? – Asaf
@Asaf:今言えば、本当の理由はありません。しかし、同期化されていないと遅くなります。 – ryyst