【发布时间】:2010-12-07 10:52:03
【问题描述】:
我有一段正在审查的代码(使用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() 没有明显 锁定对象。打电话 notify() 或 notifyAll() 没有锁 举行将导致 IllegalMonitorStateException 是 扔了
我将如何实现此方法以使其通过 FindBugs 验证?在并发课程的情况下,上述实现是否适合通知?
谢谢。
【问题讨论】:
-
您的
testMethod()本身毫无意义;这个故事一定有更多内容。事实上,答案是“不同步也不调用 notify()”。 -
查找并发数据结构的大小无论如何都没有多大意义。
-
ChssPly76,谢谢。 testMethod() 就是这样,用于检查大小,并调用 notify()。 “tackline”,我同意你的看法。
标签: java multithreading concurrency findbugs synchronized