2012-09-26 9 views
8

私は、キューからItemオブジェクトを追加および削除するコンシューマとプロデューサを持っています。私がput()take()の方法を使用している場合。私はまだカバーする必要があるスレッドの安全性の問題はありますか?これは境界のあるバッファの問題と似ています。セマフォやモニタの代わりにブロッキングキューを使用するかどうか疑問に思っていました。 Itemオブジェクト自体はおそらく同期を必要とします(setterでもgetterはロックを必要としません)。最後に、実行の順序が過小であるため、両方のスレッドで同時にtake()を呼び出すことができないため、スレッドセーフであるかどうかをテストする方法はあまりよく分かりません。何か案は?ありがとう。LinkedBlockingQueueを使用すると、マルチスレッドのJavaプログラムに十分に対応できますか?

+0

を実行の順序は非決定的ですが、あなたが ''置くいくつかの項目(場合、LBQは十分ではないという証拠はないだろう) ''、表示されません。同じ項目項目が '' take() ''の結果に繰り返し現れますか? –

+0

私は可能性のあるテストだと思うが、必ずしもスレッド固有のテストではないかもしれない。他のスレッドも呼び出している間にtake()を呼び出す途中でスレッドスリープを使用している可能性がありますか? – Dan

+0

Executorsがデフォルトで使用するものが私の質問につながります。キューとスレッドプールをラップするExecutorServiceを使用できませんか? –

答えて

7

これは、あなたがやっていることに対して完全にスレッドセーフであり、実際にはこれが設計されたものです。 BlockingQueueの記述は、(LinkedBlockingQueueによって実装されるインターフェースである)状態:

BlockingQueueの実装は、スレッドセーフです。すべてのキューイング方法 は、内部ロックまたは他の形式の同時実行制御の を使用して、その影響をアトミックに実現します。

1

同時PUT()と(テイク)彼らは2つの異なるロックを使用しているためないスレッドセーフです。

これはすでにここに答えている:Are LinkedBlockingQueue's insert and remove methods thread safe?

+0

私はリンクをたどり、それがスレッドセーフな理由を説明する別の記事への回答を見つけました。 http://stackoverflow.com/questions/26543807/is-blockingqueue-completely-thread-safe-in-java/26543940#26543940 – user1266174

関連する問題