唤醒所有线程notifyAll方法唤醒进程,本质是什么?
答:本质就是所有线程都启动,谁抢到cpu谁就执行。
为什么使用notifyAll方法唤醒会解决多个线程生产,多个线程消费之间的安全问题呢?
因为如果你使用notify方法只唤醒所有线程中的一个线程,这个线程可能是生产者的。而生产者有个判断就是如果生产了但是没消费掉的话,生产者就陷入冻结,这样就是我刚把生产者另一个线程唤醒然后我沉睡,另外那个线程醒了后一看库房里的东西还没被消费掉,那么接着陷入冻结。就有可能生产者和消费者都冻结了,那程序就停了不继续运行了。使用notifyAll就是把生产者和消费者都唤醒,然后它们抢cpu谁抢到谁执行,这样就不会所有线程都冻结了。多个线程之间因为有同步,所以不会有安全问题。
为什么老师说唤醒所有线程要重新判断是否有物品?
因为刚睡醒大家都不知道到底库房里有没有东西,所以需要使用while语句让线程醒来第一件事就是判断库房里到底有没有东西。
如果有东西说明生产者其中的某个线程刚生产过,那么我冻结等消费者线程抢到cpu后消费掉库房里的东西;如果没东西说明消费者刚消费过,那么生产者当中谁活着谁就生产。 |