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);
}
}
}