我最近看到了 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)
似乎方法入队是同步的,因此一次只能在方法主体中执行 1 个线程并调用wait()
. 一旦线程被通知,它就不能继续前进而不this.queue.size() == this.limit
再次检查条件吗?