分析这个问题时建议先学习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
,因此直接继续向下执行,但队列已经满了