分析这个问题时建议先学习jdk中的BlockingQueue
,熟悉阻塞队列
以下面的代码为例,假设这是一个生产者的代码
public void put(Object obj) throws InterruptedException{
synchronized (this) {
while(count == items.length)
this.wait();
inqueue(obj);
}
}
场景:
items中的元素已满
现在有两个生产者线程
分析:
当前两个生产者线程向队列中添加数据时,由于队列已满,因此都会执行wait方法(释放锁,线程进入waiting状态)
若此时一个消费者线程消费了一个数据,那么两个waiting状态的生产者线程会进入Runnable状态,线程1抢占锁,添加数据,释放锁,紧接着线程2获取锁,此时注意由于是if
,因此直接继续向下执行,但队列已经满了,这样就产生问题了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。