BlockedQueueの同期
-
21-09-2019 - |
質問
私は( FindBugsのを使用して)を検討していますことを、コードの部分を持っています。
public class MyClass{
...
private BlockedQueue q = new LinkedBlockingQueue<MyData>(1000);
private static final batchSize = 1000;
public boolean testMethod(){
boolean done = false;
synchronized(q){
if(q.size == batchSize){
q.notify();
done = true;
}
}
return done;
}
私は、コードのこの部分ではFindBugsを実行すると、、それはそれを不平を言う -
私は、同期コードのピースこの方法を行う同期 Aのインスタンスであるオブジェクト java.util.concurrentのクラスから パッケージ(またはそのサブクラス)。インスタンス これらのクラスの持ってそこに自分の その同時実行制御メカニズム 異なると互換性がありません キーワードを使用して 同期ます。
synchronized(q){
をコメントアウトした場合は、、それは不平を言う -
それはFindBugsの検証を通過するようにこの方法はObject.notifyを(呼び出し)、又は 明らかにせずにObject.notifyAll() オブジェクトのロックを保持しています。呼び出し ロックなし()(通知)またはのnotifyAll になります開催 IllegalMonitorStateExceptionのビーイング スロー
どのように私は、このメソッドを実装するのでしょうか?上記の実装は、並行クラスのためのケースで、通知のための正しいものですか?
ありがとうございます。
解決
notify()
wait()
と一緒に行くとjava.util.concurrent
のクラスには使用しないでください。
はBlockingQueueのを消費する要素がない場合は複数の要素またはput()
にスペースがない場合poll()
にブロックする内部メカニズムを使用します。あなたはこれを気にする必要はありません。
他のヒント
最初のエラーは、あなたが(BlockingQueueのような)java.util.concurrentのクラスに同期プリミティブのコントロールを使用してはならないことを知らせるれます。
彼らはあなたのための同期の世話をするように、一般的に、これは良い習慣です。私は手であなたの問題を解決するためのより良い方法があることを想像します。あなたが解決しようとしている実際の問題とは何ですか?
2番目のエラーは、あなたが(それにsychronizingによって)オブジェクトのロック/モニターを所有しなければならないことに起因する待機を呼び出すために/通知/のnotifyAllそれ
のBlockingQueueのはのsyncronizer のオブジェクトであります/ strong>のキューが所望の状態に入るまで(完全に空かどうかではない)ブロック
また、並行処理プログラミングの良い練習はその待ち時間を想定し、通知はwhileループに配置されています。