私がレビューしているコード部分があります ( 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 を実行すると、次のように不平を言う -
このメソッドは、java.util.concurrent パッケージ (またはそのサブクラス) のクラスのインスタンスであるオブジェクトの同期を実行します。これらのクラスのインスタンスには、synchronized キーワードの使用とは異なり、互換性のない独自の同時実行制御メカニズムがあります。
同期されたコード部分をコメントアウトすると、synchronized(q){
不平を言います-
このメソッドは、明らかにオブジェクトのロックを保持せずに Object.notify() または Object.notifyAll() を呼び出します。ロックを保持せずに notify() または notifyAll() を呼び出すと、IllegalMonitorStateException がスローされます。
FindBugs 検証に合格するには、このメソッドをどのように実装すればよいでしょうか? 上記の実装は、並行クラスの場合の通知に適していますか?
ありがとうございました。