在BlockedQueue上同步

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

谢谢。


notify()wait()一起使用,不应与java.util.concurrent类一起使用。

如果没有元素消耗,BlockingQueue使用内部机制来阻塞put()如果没有空间用于更多元素,或者使用poll() 。 你不必关心这一点。


第一个错误是指出你不应该对java.util.concurrent类使用原始同步控件(比如BlockingQueue)。

一般来说,这是一个很好的做法,因为他们为您同步照顾。 我想,有一个更好的方法来解决你手头的问题。 你试图解决的实际问题是什么?

第二个错误是由于你必须拥有对象的锁定/监视器(通过同步它)来调用wait / notify / notifyAll


BlockingQueue是一个syncronizer对象 - 根据线程的状态来协调线程的控制流程,从而控制生产者/消费者线程的流程,因为在队列进入所需状态(不为空或不完整)之前采取放置阻塞。

并发编程中的良好实践也假定等待和通知放在while循环中。

链接地址: http://www.djcxy.com/p/76249.html

上一篇: Synchronize on BlockedQueue

下一篇: Use cases for Java concurrent utilities