私は、キューからItemオブジェクトを追加および削除するコンシューマとプロデューサを持っています。私がput()
とtake()
の方法を使用している場合。私はまだカバーする必要があるスレッドの安全性の問題はありますか?これは境界のあるバッファの問題と似ています。セマフォやモニタの代わりにブロッキングキューを使用するかどうか疑問に思っていました。 Itemオブジェクト自体はおそらく同期を必要とします(setterでもgetterはロックを必要としません)。最後に、実行の順序が過小であるため、両方のスレッドで同時にtake()
を呼び出すことができないため、スレッドセーフであるかどうかをテストする方法はあまりよく分かりません。何か案は?ありがとう。LinkedBlockingQueueを使用すると、マルチスレッドのJavaプログラムに十分に対応できますか?
8
A
答えて
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
関連する問題
- 1. Auth0 - スコープが不十分で、それにどう対応するのですか?
- 2. JavaでWatchService APIとともにマルチスレッドのコンセプトを使用できますか?
- 3. C#マルチスレッドで十分なCPUが使用されない
- 4. (Java)XSLT変換はマルチスレッド対応ですか?
- 5. Adobe Flash Builder 4.5は、クロスプラットフォームアプリケーションに十分に対応しています
- 6. Javaでマルチスレッドを使用しているときフリーズするウィンドウ
- 7. ネイティブWindows UWPに対応 - モーダルコンポーネントを使用できますか?
- 8. プログラムによるログインと非API対応Googleサービスの使用
- 9. Java:このシナリオでマルチスレッドを使用すべきですか?
- 10. PingPongプログラムJavaマルチスレッド
- 11. iPhone Dev:iOS4 +のSMSにバックグラウンドで応答するプログラムを使用できますか?
- 12. Perl対Javaでのマルチスレッド化
- 13. モーダルポップアップを必要に応じてスクロールバーで十分に大きくする
- 14. iPhoneのテストにMacを使用するか、Windowsで十分ですか?
- 15. LinkedBlockingQueue対提供オファー
- 16. Javaでマルチスレッド環境用のカスタムイベントリスナーWait()とnotify()を使用する
- 17. 自分のコードでマルチプロセッシング/マルチスレッドを使用するには?
- 18. ASP.NETメンバーシップに対応するJavaとは何ですか?
- 19. ビュー内でWebViewを使用できますか(ネイティブ対応)?
- 20. 十分なトランザクションでコミットを使用していますか?
- 21. JavaシングルスレッドCPU使用とマルチスレッドCPU使用
- 22. ノードなしでJavaとTomcatで反応的に使用できますか?
- 23. wss:bindingのJava-configの対応部分ですか?
- 24. junitのテストクラスは、常にプログラムのクラスと一対一で対応します
- 25. Java:クラスをスレッドセーフにするのに十分な揮発性?
- 26. PythonプログラムでJavaコードを使用することはできますか?
- 27. 十分なチェックサムを使用
- 28. Excel VBAを使用してSAP BO WEBIにクエリを実行できますか?私はそれを十分に速くすることができますか?
- 29. Javaはライブスクリーン共有を実行するのに十分速いですか?
- 30. デコンボリューションのステップ応答で十分な情報ですか?
を実行の順序は非決定的ですが、あなたが ''置くいくつかの項目(場合、LBQは十分ではないという証拠はないだろう) ''、表示されません。同じ項目項目が '' take() ''の結果に繰り返し現れますか? –
私は可能性のあるテストだと思うが、必ずしもスレッド固有のテストではないかもしれない。他のスレッドも呼び出している間にtake()を呼び出す途中でスレッドスリープを使用している可能性がありますか? – Dan
Executorsがデフォルトで使用するものが私の質問につながります。キューとスレッドプールをラップするExecutorServiceを使用できませんか? –