同步上BlockedQueue
-
21-09-2019 - |
题
我有一个码片,我审查(使用 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循环。