我最近看到下面的实现排队的一个BlockingQueue的 (source)while循环在Java中的BlockingQueue实现
public synchronized void enqueue(Object item)
throws InterruptedException {
while(this.queue.size() == this.limit) {
wait();
}
if(this.queue.size() == 0) {
notifyAll();
}
this.queue.add(item);
}
为什么while
循环必要的,并且可以在while
通过if (this.queue.size() == this.limit)
被替换看起来方法入队是同步的,因此一次只能有一个线程在方法体中执行,并调用wait()
。线程一旦收到通知,无法再继续检查this.queue.size() == this.limit
条件继续前进吗?
谢谢。后续问题:为什么在添加项目之前排队调用notifyAll()?这不会导致线程等待出队以检查空队列吗?首先添加项目然后notifyAll会更好吗?像这样:queue.add(item); if(queue.size()== 1){notifyAll();} – morfys 2012-03-26 08:43:04
恕我直言,关闭add(item)和notifyAll()的顺序并不重要,因为方法enqueue是同步的。因此add(item)和notifyAll()调用都必须在另一个线程可以执行之前完成。 – morfys 2012-03-26 09:06:21