質問

私は( 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){をコメントアウトした場合は、

、それは不平を言う -

  

この方法はObject.notifyを(呼び出し)、又は   明らかにせずにObject.notifyAll()   オブジェクトのロックを保持しています。呼び出し   ロックなし()(通知)またはのnotifyAll   になります開催   IllegalMonitorStateExceptionのビーイング   スロー

それはFindBugsの検証を通過するように

どのように私は、このメソッドを実装するのでしょうか?上記の実装は、並行クラスのためのケースで、通知のための正しいものですか?

ありがとうございます。

役に立ちましたか?

解決

notify() wait()と一緒に行くとjava.util.concurrentのクラスには使用しないでください。

はBlockingQueueのを消費する要素がない場合は複数の要素またはput()にスペースがない場合poll()にブロックする内部メカニズムを使用します。あなたはこれを気にする必要はありません。

他のヒント

最初のエラーは、あなたが(BlockingQueueのような)java.util.concurrentのクラスに同期プリミティブのコントロールを使用してはならないことを知らせるれます。

彼らはあなたのための同期の世話をするように、一般的に、これは良い習慣です。私は手であなたの問題を解決するためのより良い方法があることを想像します。あなたが解決しようとしている実際の問題とは何ですか?

2番目のエラーは、あなたが(それにsychronizingによって)オブジェクトのロック/モニターを所有しなければならないことに起因する待機を呼び出すために/通知/のnotifyAllそれ

その状態に基づいて座標スレッドの制御フローを、したがって、を取るので、プロデューサ/コンシューマスレッドの流れを制御し、のPUT < -

BlockingQueueのはのsyncronizer のオブジェクトであります/ strong>のキューが所望の状態に入るまで(完全に空かどうかではない)ブロック

また、並行処理プログラミングの良い練習はその待ち時間を想定し、通知はwhileループに配置されています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top