Skip to content

Bug:关于 生产者 已满的判断时机 #3

@maizhenhui

Description

@maizhenhui

public synchronized void produceGoods(){
try {
Goods goods = new Goods();
boolean flag = queue.offer(goods, 3, TimeUnit.SECONDS);
if(flag){
count++ ;
goods.setId(count);
goods.setName("goods"+count);
System.out.println("生产成功:商品编号:"+goods.getId()+",名字:"+goods.getName() +",库存:"+ queue.size() );
Thread.sleep((long)(Math.random()*10));
notifyAll();//有新商品了,通知消费者消费...
}else{
System.out.println("生产商品失败...");
}
if(queue.size() >= 100){
System.out.println("库存已满,等待消费。。。");
wait();
}
}catch(Exception e){
e.printStackTrace();
}
}

如果不提前判断库存量(队列长度),暂停生产者线程,有可能会出现库存量超过 100 的情况。
由于生产者线程有两个,而 wait() 方法只会阻塞当前生产者线程,假如另一个生产者线程因为调度得到了CPU资源,那么首先会正常进行商品的生产,然后才会暂停这个生产者线程,从实际的情况来看已经超过了库存量 100

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions