CountDownLatch
in Java は、すべてのスレッドの準備が整うまで特定のスレッドが処理を開始するのを防ぐために使用される高レベルの同期ユーティリティです。
しかし、Semaphore
まったく同じことができます。それで、のメリットはCountDownLatch
何ですか?
もう 1 つの質問:CountDownLatch
メリットがあるとすれば、なぜ 1 回だけ使用するように設計されているのですか? カウントをリセットする set メソッドを追加するのは簡単だと思います。
CountDownLatch
in Java は、すべてのスレッドの準備が整うまで特定のスレッドが処理を開始するのを防ぐために使用される高レベルの同期ユーティリティです。
しかし、Semaphore
まったく同じことができます。それで、のメリットはCountDownLatch
何ですか?
もう 1 つの質問:CountDownLatch
メリットがあるとすれば、なぜ 1 回だけ使用するように設計されているのですか? カウントをリセットする set メソッドを追加するのは簡単だと思います。
意味的には、それらは異なります。コードが読みやすくなるため、これは重要です。セマフォを見ると、すぐに「限られた量の共有リソース」と考え始めます。CountDownLatch を見ると、すぐに「たくさんのスレッドが「実行」を待っている」と考え始めます。信号。" 実際に後者が必要なコードで前者を教えてくれると、混乱します。
この意味で、CountDownLatch として使用されるセマフォは、庭の小道の文に少し似ています。技術的には正しいですが、それは人々を迷わせ、混乱させます。
より実用的な使用法という点では、CountDownLatch が必要な場合は単純です。シンプルなほうがいい!
CountDownLatch の再利用に関しては、その使用法が複雑になります。たとえば、ある作業のためにスレッド A、B、および C をキューに入れようとしているとします。ラッチで待機させてから、リリースします。次に、おそらく他の作業のためにスレッド D、E、および F をキューに入れるために、それをリセットします。しかし、(競合状態のために) スレッド B がまだ最初のラッチから実際に解放されていない場合はどうなるでしょうか? await()
まだ電話に出ていなかったとしたら?ゲートを閉じて、D、E、F で 2 回目のオープンを待つように伝えますか? 2 番目の開始が B が実行するはずの作業に依存している場合は、デッドロックが発生する可能性さえあります。
CountDownLatch について最初に読んだとき、リセットについてあなたがしたのと同じ質問がありました。しかし、実際には、リセットしたいと思ったことはめったにありません。「待ってから行く」 (ABC、次に DEF) の各ユニットは、それに合わせて独自の CountDownLatch を作成するのに自然に役立ち、物事は素晴らしくシンプルなままです。
0 に達したときのn ブロックのセマフォ。
0 になるまでn ブロックのCountDownLatch 。その後、すべてがほぼ同時に続きます。
つまり、セマフォはディスコのゲート キーパーのようなものであり、カウント ダウン ラッチはゲーム コースのスタート ショットのようなものです。
セマフォはまったく同じことを行うことができます。では、CountDownLatch のポイントは何ですか?
Semaphore
一連の許可を維持します。許可が得られるまで、必要に応じてそれぞれacquire()
がブロックし、それを受け取ります。それぞれrelease()
が許可を追加し、ブロックしている取得者を解放する可能性があります。
ただし、実際の許可オブジェクトは使用されません。Semaphore は、使用可能な数のカウントを保持し、それに応じて動作します。
Semaphore
クリティカル セクションに入るエントリをブロックしており、CountDownLatch
他のスレッドがタスクを完了しない限り、メイン スレッドの実行をブロックしています。
詳細については、この SE の質問をご覧ください。
CountDownLatch にいくつかのポイントがある場合、一度だけ使用するように設計されているのはなぜですか?
繰り返し使いたい場合はCyclicBarrierを使用
一連のスレッドが互いに共通のバリア ポイントに到達するのをすべて待機できるようにする同期支援。CyclicBarriers は、相互に時折待機する必要がある固定サイズのスレッドのパーティを含むプログラムで役立ちます。バリアは、待機中のスレッドが解放された後に再利用できるため、サイクリックと呼ばれます。
CountDownLatch の Javadoc は次のように引用しています。
CountDownLatch は 1 回限りの現象であり、カウントをリセットすることはできません。カウントをリセットするバージョンが必要な場合は、CyclicBarrier の使用を検討してください。