synchronized キーワードを使用すると、スレッドの安全性と共有リソースへの同期アクセスを確保するためにミューテックスが使用されます。複雑な同時タスクを完了するには、スレッド間でさらに調整された実行が必要になることがよくあります。たとえば、待機/通知モードは、マルチスレッド環境における調整された実行メカニズムです。
API (ミューテックスを使用) を介してロックを取得および解放したり、wait/notify やその他のメソッドを呼び出したりすることは、すべて低レベルの呼び出しメソッドです。さらに、スレッド同期のためのより高いレベルの抽象化を作成する必要があります。一般的に使用される同期補助クラスは、2 つ以上のスレッド間の同期アクティビティ メカニズムをさらにカプセル化するもので、その内部原理は、既存の基盤となる API を使用してスレッド間の複雑な調整を実現することです。
一般的な同期シナリオに適した 5 つの同期ヘルパー クラスがあります。
1. セマフォ セマフォは古典的な同期ツールです。セマフォは、スレッドが同時にアクセスできるリソース (物理または論理) の数を制限するためによく使用されます。
2.CountDownLatch は非常に単純ですが、よく使用される同期補助クラスです。その目的は、他のスレッドで実行されている一連の操作が完了するまで、1 つ以上のスレッドをブロックできるようにすることです。
3. CyclicBarrier は、特定の同時プログラミング シナリオで役立つ、リセット可能な多方向同期ポイントです。これにより、スレッドのグループが共通のバリア ポイントに到達するまで相互に待機できるようになります。 CyclicBarrier は、時々相互に待機する必要がある固定サイズのスレッドのセットを含むプログラムで役立ちます。バリアは待機中のスレッドが解放された後も再利用できるため、循環バリアと呼ばれます。
4. Phaser は、CyclicBarrier および CountDownLatch と機能的に似ていますが、より柔軟に使用できる再利用可能な同期バリアです。マルチスレッド環境でフェーズド コンピューティング タスクを同期的に調整するのに非常に適しています (Fork/Join フレームワークのサブタスク間で同期が必要な場合は、Phaser が推奨されます)。
5.Exchanger を使用すると、2 つのスレッドが特定のミーティング ポイントでオブジェクトを交換できるようになります。これは、特定のパイプライン設計でより便利です。 Exchanger は、スレッドのペアがデータを交換できる同期ポイントを提供します。各スレッドは、exchange() メソッドのエントリを通じてパートナー スレッドにデータを提供し、パートナー スレッドから提供されたデータを受信して返します。 2 つのスレッドが Exchanger を通じてオブジェクトを交換する場合、その交換は両方のスレッドにとって安全です。 Exchanger は SynchronousQueue の双方向形式と考えることができ、遺伝的アルゴリズムやパイプライン設計を含むアプリケーションでより役立ちます。