系列文章目录
一、前言
我们把上一篇的完整代码拷贝下来,继续改造
上一篇我们是一个厨师一个服务员
如果是两个厨师或者多个厨师,两个服务员或者多个服务员怎么处理
二、具体操作
直接运行
我们明明加锁了,而且也加条件判断了,怎么可能还出现负数呢?
其实很好理解,假如翠花抢到了CPU,然后他执行完释放了,这时候别的服务员就有机可乘了
注意翠花收到厨师的通知之后一定是从上一次的 wait()后面开始运行
所以安全问题又暴露了
二、解决办法
一种是再次调用这个方法,另一种是改造成另一种语法
什么样的语法结果能够让代码回去呢?
没错,是while循环
那这样会不会一直while 出不来了呢?不会,因为条件不满足它就会往下走了,while的存在只是让它重新判断,
这样做的好处就是不管什么情况下每个线程进来都会重新判断
多线程不能完全按照单线程的思路去思考问题
我们再想办法让程序员暴露出一个问题,概率较低,这里不好演示了,意思就是超过1个生产者或者消费者的时候,建议使用
notifyAll(),一次唤醒所有的服务员,而不是一个
这样就不会卡顿,否则可能会小概率的卡顿
Object类中有:
(1)wait():必须由锁对象(线程的监视器对象)来调用。
(2)notify():必须由锁对象(线程的监视器对象)来调用。notify()作用就是唤醒一个正在等待的线程。唤醒的是同一个锁对象监视的等待线程。
(3)notifyAll():唤醒所有和我是同一个监视器对象的正在等待的线程
总结
1、notifyAll():唤醒所有和我是同一个监视器对象的正在等待的线程,一个生产者或者消费者的时候的时候也可以用