我有一个码片,我审查(使用 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(q){,它抱怨 -

  

这个方法调用Object.notify()或   Object.notifyAll()没有明显   保持该物体上的锁。调用   通知()或notifyAll的()没有锁   举行将导致   抛出:IllegalMonitorStateException存在   抛出

我将如何使之穿过FindBugs的验证实现此方法?是上述实施右一为通知在用于并发类情况?

感谢您。

有帮助吗?

解决方案

notify()wait()一起进入并且不应该与java.util.concurrent的类使用。

的BlockingQueue使用内部机制来上一个put()块,如果有更多的元件或上poll()没有空间,如果没有元件消耗。你不必在意这一点。

其他提示

在第一个错误,指出不应在java.util.concurrent类使用原始的同步控制(如BlockingQueue的)。

一般情况下,这是很好的做法,因为他们照顾同步的为您服务。我想像有一个好办法,一方面解决您的问题。什么是你要解决实际问题?

在第二错误是由以下事实引起的必须拥有的对象的锁/监视器(由sychronizing在其上),以调用wait /通知/ notifyAll的在其上

BlockingQueue的是一个的 syncronizer 对象 - 的坐标是根据它的状态,并且因此生产的控制流程/消费者线程因为的和<强>把线程的控制流块,直到队列进入期望的状态(不为空或者未满)。

此外,在并发编程好的做法假定等待和通知被放置在while循环。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top