在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