JAVA生产者与消费者问题( 三 )


■网友
在使用wait/notify的时候,可能会产生多线程wait的情况。打个比方:一个包子铺,有两个人(p1,p2)做包子,每天只做100个包子,假设只有一个笼屉,里面只能放10个;估计每天会有10个人(c1,c2,...c10)来买包子,当笼屉里面没有包子的时候,来买包子的人就会等待着,可能会产生所有来买包子的人都在等着,但是更糟糕的事情发生了,包子已经做够100个,老板今天不做包子了。这个时候来买包子的人还会在哪里傻傻等着~~~~除非老板告诉他们没有了,但是老板不可能挨个的去通知每一个人。
■网友
先说结论: 问题就是你synchronized锁住的对象和调用wait的对象不是同一个
JAVA生产者与消费者问题

这个时候会有竞态条件的问题, 所以会抛一个IllegalMonitorStateException异常提醒你;
所以你只需要把子线程中的this改成p就可以了;
顺带说个问题, JAVA中的类名最好大写;
至于synchronized锁住的对象和调用wait的对象必须是同一个的原因是:
你调用this(消费者).wait()是等待在消费者的锁上, 你这个时候再使用this(生产者).notify()唤醒的是等待在生产者这把锁上的线程, 无法唤醒消费线程的;
【JAVA生产者与消费者问题】 详细的回答可以看Object.wait()解析, 里面有详细的说明;


推荐阅读