2009-10-14 8 views
7

私は、同時キューの考え方を理解するのに苦労しています。私はキューがFIFOであること、または最初に最初に来たデータ構造を理解しています。同時キュー - 一般的な質問(説明と使用法)

スレッドセーフティと解釈する同時実行性の部分を追加すると(それが間違っているかどうかを教えてください)、少しばかげてしまいます。並行性とは、さまざまなスレッドがキューに追加する方法、またはキューからアイテムを削除する方法を意味します。並行処理はこの操作に順序づけられますか?

私は、並行キューの機能の一般的な説明を高く評価します。同様の投稿hereは私が望むほど一般的ではありません。

また、並行優先キューのようなものがありますか?その使用法は何ですか?

この件に関する簡単な説明や役に立つリンクについては、事前に感謝します。

答えて

0

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

質問の2番目の部分に答えるには、学習する優先度キューの実装はPriorityBlockingQueueです。これは、プロデューサスレッドが優先度の異なるタスク(「通常のユーザー」や「パワーユーザー」など)を作成していて、コンシューマスレッドによってタスクが処理される順序を制御したい場合に便利です。 。可能性のある落とし穴の1つは、より優先度の高いタスクが絶え間なく流入するため、キューから決して削除されない優先度の低いタスクの不足です。

0

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

ロックフリーのFIFOキュー(Delphiで)を書きましたが、うまくいきました。クリティカルセクションを使用した以前のバージョンよりもずっと効率的です。 CSバージョンは、特にキューにアクセスしようとするスレッドが多数あるため、停止します。しかし、ロックフリーのバージョンでは多くのスレッドが多くアクセスするボトルネックはありませんでした。

+0

スレッドセーフなキューインプリメンテーションを変更するためにロックを取得すると、オーバーヘッドがほとんどなく、java.util.concurrentパッケージ内のすべてのBlockingQueue実装で少なくとも1つのロックが使用されます。ロックがなければ、プロデューサ/コンシューマはブロッキングのput/takeを実行できず、一括操作(drainToなど)はアトミックに行うことはできません。 – Adamski

+0

私はJavaがロックフリーのキューを使用していると考えました:http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html – Steve

0

ちょうどここにはlink to the java.util.concurrent packageを残しておきますが、私はここで提起されたいくつかの質問について非常に重要な情報が含まれていると思います。

参照:並行コレクションとBlockingQueueのは、わずかなオーバーヘッドを提供することをMemory Consistency Properties

5

概念は、先頭ビットのミスです。ロックを取得するとかなりのオーバーヘッドが発生します。コンテキストの切り替えだけで何千もの命令を話しています。それだけでなく、あるスレッドの進捗状況が別のスレッドに直接影響します。今、それは数年前と同じくらい悪くないが、非ブロッキングと比較して、それは実質的です。相互排除のための

BlockingQueueのの使用がロック

ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQUeue:

ConcurrentLinkedQueue、Javaの1.7 LinkedTransferQueueながら3は、キューのをブロックしている:マイケル・スコット、非ブロッキングキューアルゴリズムを使用します。

中程度から低い競合(実世界のシナリオのほうが多い)では、非ブロッキングキューが大幅にブロッキングキューを実行します。

ボトルネックの不足に関するSteveのコメントに注意してください。重大な競合の下では、ブロッキングはスレッドを中断しますが、非ブロッキング・アルゴリズムは一定のcas試行でネックをボトルできます。その後、重度の競合下にあるBlockingQueueは、非ブロッキングキューを実行しますが、その競合のタイプは決して標準ではありません。

関連する問題