我有一个正在审查的代码片段(使用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 验证?在并发课程的情况下,上述实现是否适用于通知?
谢谢你。