2012-03-01 3 views
0

私は、バッファを使用してスレッド間でオブジェクトを渡すJavaアプリケーションを公開しています。一般的に私はBufferUtilsを使ってこれらのバッファを同期させます。バッファにオブジェクトを追加するスレッドが1つしかなく、バッファからオブジェクトを削除して削除するスレッドが1つしかない場合は、そのオブジェクトを削除します。それらの間のバッファは同期する必要がありますか?1つのスレッドだけが追加され、1つの(異なる)スレッドのみが削除される場合、バッファを同期させる必要がありますか?

問題の2つのスレッドがスプリング・ビーンからインスタンス化され、両方が参照するバッファー用に3番目のBeanを持つことによって、共有バッファーにしか手を出せない状況があります。私は、Beanから同期化されたバッファを作る方法を理解できなかったので、それが必要かどうかという疑問がありました。

答えて

1

おそらく、BlockingQueueを使用してそれらのオブジェクトを渡すことができます。ブロッキングキューはスレッドセーフです。さらに、それはいくつかのput/getバリエーションを提供しています。 putメソッドは、たとえば、キュ​​ーに十分な空きがあるまでスレッドをブロックします。 Offerメソッドは、タイムアウトで使用できるため、キューに追加できない場合はfalseを返します。

あなたは BlockingQueue

+0

これは私が必要な正確に何をした、ありがとう。さらに、オブジェクトを追加するタイムアウトのためのいくつかの非常に優れたメソッドを持っています.BufferOverflowをキャッチする代わりにaddでブール値を返します。本当にありがとう! – tdimmig

+0

これはほぼ第2の質問ですが、全く新しい投稿をする価値はほとんどありません。パフォーマンスが向上する限り、BlockingQueueがBufferUtilsと同期したバッファとどのように比較されているか知っていますか? – tdimmig

+0

(非常に)遅れて返信して申し訳ありません。あなたは本当に確かめるためにいくつかのテストを実行する必要があります。 BlockingQueueのバリアントはよく書かれ、効率的です。 Java 5で追加された並行パッケージの一部ですが、誤解されていない場合はそうです。しかし、最終的には、あなたが使用した方法があなたに合っているかどうかを確認するために、いくつかのテストを行い、いくつかの測定を行う必要があります。使用可能なクラスを見て、Array backまたはLinkedListでサポートされているキューから選択することができます。詳細については、上記のドキュメントを参照してください。乾杯、ティベリ –

1

はいバッファを同期する必要がありますそれをチェックアウトすることができます。 Javaメモリモデルでは、複数のスレッドが同期なしで同じデータ構造にアクセスしている場合、あるスレッドの変更が他のスレッドから見えるという保証はありません。 BlockingQueueのいくつかのフォームは、そのトリックを行う必要があります。

関連する問題