7

並行キューの概念を理解するのに問題があります。キューはFIFO、つまり先着順のデータ構造であることを理解しています。

ここで、スレッドセーフと解釈する同時実行部分を追加すると(それが正しくない場合はお知らせください)、状況が少しあいまいになります。同時実行とは、さまざまなスレッドがキューに追加したり、キューから削除(アイテムの処理)したりする方法を意味しますか?並行性は、この操作に順序付けの感覚を提供していますか?

並行キューの機能の一般的な説明をいただければ幸いです。ここでの同様の投稿は、私が望んでいたほど一般的ではありません。

また、同時優先キューなどはありますか?その使用法は何でしょうか?

このテーマに関する簡単な説明や役立つリンクを事前に感謝します。

4

4 に答える 4

5

BlockingQueue がほとんどオーバーヘッドを提供しないという考えは、少しミスリードです。ロックを取得すると、かなりのオーバーヘッドが発生します。コンテキストの切り替えだけでも、何千もの命令を話していることになります。それだけでなく、あるスレッドの進行状況が別のスレッドに直接影響します。今では、数年前ほど悪くはありませんが、ノンブロッキングと比較するとかなりのものです。

BlockingQueue の相互排除のためのロックの使用

ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQUeue: 3 つのブロッキング キューです。

ConcurrentLinkedQueue、java 1.7 LinkedTransferQueue: Michael と Scott のノンブロッキング キュー アルゴリズムを使用します。

競合が中程度から低い場合 (これはより現実的なシナリオです)、非ブロッキング キューはブロッキング キューよりもパフォーマンスが大幅に優れています。

そして、ボトルネックがないことについてのスティーブのコメントに注意してください。競合が激しい場合、非ブロッキング アルゴリズムは一定の cas 試行でボトルネックになる可能性がありますが、ブロッキングはスレッドを中断します。次に、激しい競合下にある BlockingQueue が非ブロッキング キューよりもわずかにパフォーマンスが優れていることがわかりますが、そのような種類の競合は決して標準ではありません。

于 2009-10-14T15:37:33.933 に答える
0

BlockingQueueインターフェース定義を確認することから始める必要があります。これは、スレッド間の通信にキューを使用するための基礎であり、プロデューサースレッドとコンシューマースレッドがブロッキングまたは非ブロッキングのいずれかの方法でキューにアクセスできるようにするユーティリティメソッドが含まれています。これは、スレッドセーフなアクセスとともに、「並行キュー」を構成するものについての私の理解です(ただし、そのフレーズは聞いたことがありません。パッケージBlockingQueueに存在するだけです)。java.util.concurrent

質問の2番目の部分に答えるために、検討する必要のある優先キューの実装はPriorityBlockingQueueです。これは、プロデューサースレッドがさまざまな優先度のタスク(たとえば、「通常のユーザー」と「パワーユーザー」からのリクエスト)を生成していて、タスクがコンシューマースレッドによって処理される順序を制御したい場合に役立ちます。 。回避すべき1つの考えられる落とし穴は、優先度の高いタスクが絶えず流入するためにキューから削除されることのない、優先度の低いタスクの枯渇です。

于 2009-10-14T14:40:46.807 に答える
0

「並行性」によって、キューがスレッドセーフであることを理解しています。これは、それが効率的であることを意味するものではありません。ただし、Javaキューはロックフリーの実装を使用していると思います。つまり、2つのスレッドが同時にプッシュまたはポップを試行しても、ペナルティはほとんどまたはまったくありません。一般的に発生するのは、アセンブラレベルでアトミックロックを使用して、同じオブジェクトを2回ポップできないようにすることです。

私はかつて(Delphiで)ロックフリーのFIFOキューを作成しましたが、これは非常にうまく機能しました。クリティカルセクションを使用していた以前のバージョンよりもはるかに効率的です。CSバージョンは、特に多くのスレッドがすべてキューにアクセスしようとしているため、停止しました。ただし、ロックフリーバージョンには、多くのスレッドがアクセスするためのボトルネックはありませんでした。

于 2009-10-14T14:41:39.803 に答える
0

ここで提起されたいくつかの質問に関する非常に重要な情報が含まれていると思われるパッケージへのリンクをjava.util.concurrentここに残しておきます。

参照: 並行コレクションとメモリー一貫性プロパティ

于 2009-10-14T14:56:26.713 に答える