0

まず、検索を使用して、この質問に関連する n 個のトピックを見つけました。残念ながら、彼らは私を助けなかったので、それは n++ トピックになります:)

状況: いくつかの作業スレッド (同じクラス、多くの複製) (それらを WT と呼びましょう) と 1 つの結果書き込みスレッド (RT) があります。

WT はオブジェクトをキューに追加し、RT はそれらを受け取ります。多くの WT があるため、メモリの問題はありませんか (最大キュー サイズとは関係ありません)。これらの操作は、お互いが完了するのを待ちますか?

さらに、私が理解しているように、BlockingQueue は非常に遅いので、同期ブロックではそのままにして通常の Queue を使用する必要がありますか? または、SynchronizedQueue を使用して自分自身を考慮する必要がありますか?

4

1 に答える 1

2

LinkedBlockingQueue同じキューに書き込む複数のスレッドを処理するように設計されています。ドキュメントから:

BlockingQueue実装はスレッドセーフです。すべてのキューイング メソッドは、内部ロックまたはその他の形式の同時実行制御を使用して、アトミックに効果を達成します。ただし、一括Collection操作addAllcontainsAllretainAllおよびremoveAllは、実装で特に指定されていない限り、必ずしもアトミックに実行されるとは限りません。

したがって、(一括操作がアトミックであると予想しない限り) 非常に安全です。

もちろん、スレッド A とスレッド B が同じキューに書き込んでいる場合、A と B を同期しない限り、B のアイテムに対する A のアイテムの順序は不確定になります。

キューの実装の選択に関しては、ジョブを実行する最も単純なものを使用してからプロファイルします。これにより、ボトルネックの場所に関する正確なデータが得られるため、推測する必要がなくなります。

于 2013-03-08T13:56:13.603 に答える