我试图找出是否有可能有一个多生产者/多消费者队列,我可以在其中使用notify()
而不是notifyAll()
. 例如,在下面的实现中(来源:here)你不能简单地切换notifyAll()
for notify()
。为什么你不能切换并不完全清楚,所以我将把它作为一个预告片留给任何想帮助我理解这个问题的人。
所以下面的代码被破坏了:
public class BlockingQueue {
private Object lock = new Object();
private List queue = new LinkedList();
private int limit = 10;
public BlockingQueue(int limit){
this.limit = limit;
}
public void enqueue(Object item)
throws InterruptedException {
synchronized(lock) {
while(this.queue.size() == this.limit) {
lock.wait();
}
if(this.queue.size() == 0) {
lock.notify();
}
this.queue.add(item);
}
}
public Object dequeue()
throws InterruptedException{
synchronized(lock) {
while(this.queue.size() == 0){
lock.wait();
}
if(this.queue.size() == this.limit){
lock.notify();
}
return this.queue.remove(0);
}
}
}