一.
while的出现为了使得活过来的线程,回过来判断标记用的。可是t0醒来后,唤醒的是自己一方的线程,把本方唤醒后再判断标记,本方也就睡着了,对方没有被唤醒过,大家都睡着了。
我们希望什么,t0在唤醒的时候,至少能够唤醒一个对方,没有对方才导致我们的程序死锁。怎么唤醒对方?没有这个方法。notify唤醒的是任意一个线程,并非指定的。无法做到特定唤醒,我们就直接全部唤醒,notifyAll。t0活着的时候,t1和t2全是wait的,讲这三个线程全部唤醒,本方醒了判断标记会停止,而对方醒了判断标记会继续执行。对方能醒两个,只有一个能工作,没有什么问题。因此,将程序中的notify()方法,改为notifyAll()。
改进后的程序编译运行没有任何问题,至此多生产多消费的问题就解决了。
二. 通过图例的形式讲述整个程序
这部分讲述非常的精彩,具体的过程看视频。整个流程就是集中在if和while,notify和notifyAll,死锁....等一系列问题。
(我的部分理解,对于视频中的讲解,每次唤醒的线程是随机的,如果是全部唤醒的话,相当于都有了资格,都来争取执行权。如果又有线程被冻结了,那么剩下的线程继续争夺执行权)
现在有人提出,由于notifyAll的存在,到底程序的效率降低。将本方线程也唤醒,本方还要判断标记,再次冻结。后期多线程的架构中提供了一些解决方案。升级以后解决的,没升级前就是这样的。