阻塞队列 - 为什么没有 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);
}
}
我的理解是这样的:
- 如果队列中没有更多的项目,没有任何东西可以出列,所以我们调用 wait()
- 如果队列中有最大数量的项目,则无法入队,因此我们调用 wait()
- 如果队列中有一些 space(和一些元素),我们可以调用入队和出队
- 我们还 notifyAll() 以便所有生产者和消费者醒来
但是我们调用 wait() 的请求会发生什么。他们只在 notifyAll() 调用时收到通知吗?为什么他们在队列中 space 后没有立即收到通知?
您只需要在添加到空队列时通知,因为出队者只在空队列上等待。
同样,您只需要在从满队列中出队时通知,因为入队者只在等待满队列。
理解代码需要注意的两个细节:
- 线程在被唤醒之前也需要获取锁,所以这两个
notifyAll
可以放在最后一行以外的地方。
- 除了等,还有排队。当没有线程在等待其条件时,所有线程都在排队以获得锁,这就是代码仅在队列满或空时才执行
notifyAll
的原因。
我正在网上浏览这个边界队列代码试图理解它
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);
}
}
我的理解是这样的:
- 如果队列中没有更多的项目,没有任何东西可以出列,所以我们调用 wait()
- 如果队列中有最大数量的项目,则无法入队,因此我们调用 wait()
- 如果队列中有一些 space(和一些元素),我们可以调用入队和出队
- 我们还 notifyAll() 以便所有生产者和消费者醒来
但是我们调用 wait() 的请求会发生什么。他们只在 notifyAll() 调用时收到通知吗?为什么他们在队列中 space 后没有立即收到通知?
您只需要在添加到空队列时通知,因为出队者只在空队列上等待。
同样,您只需要在从满队列中出队时通知,因为入队者只在等待满队列。
理解代码需要注意的两个细节:
- 线程在被唤醒之前也需要获取锁,所以这两个
notifyAll
可以放在最后一行以外的地方。 - 除了等,还有排队。当没有线程在等待其条件时,所有线程都在排队以获得锁,这就是代码仅在队列满或空时才执行
notifyAll
的原因。