分析该问题时建议了解过阻塞队列的实现
示例代码:
public void put(Object obj) throws InterruptedException{
synchronized (this) {
while(count == items.length)
this.wait();
inqueue(obj);//省略,包含notifyAll逻辑
}
}
public Object take() throws InterruptedException{
synchronized (this) {
while(count == 0)
this.wait();
return outqueue();//省略,包含notifyAll逻辑
}
}
场景:
2个消费者线程C1、C2, 2个生产者线程P1、P2,队列大小为1
分析:
C1、C2消费,此时队列数据为空,都进入waiting状态
P1、P2生产,P1生产数据后若使用notify,则可能通知到的是P2,但P2生产时队列的数据已满,又进入waiting状态,若没有其他的线程进入,此时的状况是C1、C2、P2都处于waiting状态,队列中有一条数据,这样就明显产生问题了
若使用notifyAll,所有waiting状态的线程都有可能抢占锁,让消费者有可能消费数据
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。