阻塞队列 - 为什么没有 notify()

Blocking Queue - Why is there no notify()

我正在网上浏览这个边界队列代码试图理解它

public class BlockingQueue {

  private List queue = new LinkedList();
  private int  limit = 10;

  public BlockingQueue(int limit){
    this.limit = limit;
  }


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


  public synchronized Object dequeue()
  throws InterruptedException{
    while(this.queue.size() == 0){
      wait();
    }
    if(this.queue.size() == this.limit){
      notifyAll();
    }

    return this.queue.remove(0);
  }

}

我的理解是这样的:

  1. 如果队列中没有更多的项目,没有任何东西可以出列,所以我们调用 wait()
  2. 如果队列中有最大数量的项目,则无法入队,因此我们调用 wait()
  3. 如果队列中有一些 space(和一些元素),我们可以调用入队和出队
  4. 我们还 notifyAll() 以便所有生产者和消费者醒来

但是我们调用 wait() 的请求会发生什么。他们只在 notifyAll() 调用时收到通知吗?为什么他们在队列中 space 后没有立即收到通知?

您只需要在添加到空队列时通知,因为出队者只在空队列上等待。

同样,您只需要在从满队列中出队时通知,因为入队者只在等待满队列。

理解代码需要注意的两个细节:

  1. 线程在被唤醒之前也需要获取锁,所以这两个notifyAll可以放在最后一行以外的地方。
  2. 除了等,还有排队。当没有线程在等待其条件时,所有线程都在排队以获得锁,这就是代码仅在队列满或空时才执行 notifyAll 的原因。