本帖最后由 ℃葫芦 于 2015-8-12 21:43 编辑
先按照运行0、3、1、3、0结果分析唤醒冻结最久的那条:
0线程运行==》生产烤鸭1==》0线程冻结
下面有两种可能
一种可能是1线程运行,第二种可能是3线程运行,分别说:
可能一:
1线程运行==》判断flog为true==》1线程冻结==》并没有打印任何结果也没唤醒。
3线程运行==》消费烤鸭1==》唤醒冻结最久的0线程==》3线程冻结。
然后下面一个是1线程消费,说明这个可能被否定了。
那么必然是可能二,重新来走一遍
0线程运行==》生产烤鸭1==》0线程冻结
3线程运行==》消费烤鸭1==》唤醒冻结最久的0线程==》3线程冻结。
下面又分两种可能①、2线程运行被冻结;②、1线程运行,2线程未运行,:
①、2线程运行==》2线程判断flog==》2线程冻结(此时未冻结线程只有0、1,根据打印结果,下次运行的是1;冻结的线程按时间算是3>2)
1线程运行==》1线程生产烤鸭2==》1线程唤醒3线程==》1线程冻结。(此时冻结的线程为2>1)
3线程运行==》3线程消费烤鸭2==》3线程唤醒2线程==》3线程冻结。(此时冻结线程为1>3)
0线程运行==》0线程生产烤鸭3==》0线程唤醒1线程==》0线程冻结。(此时冻结线程为3>0)
至此2线程还未被冻结,如果按照此推断,这时应该是2线程消费烤鸭3。
而另一种可能:
② 0线程运行==》生产烤鸭1==》0线程冻结
3线程运行==》消费烤鸭1==》唤醒冻结最久的0线程==》3线程冻结。
1线程运行==》生产烤鸭2==》唤醒3线程==》1线程冻结
然后又有两种:2线程运行被冻结;2线程未运行,3线程运行
3线程运行==》消费烤鸭2==》唤醒1线程==》3线程冻结 0线程运行==》生产烤鸭3==》唤醒3线程==》0线程冻结
可以看到此时3线程未被冻结, 按此理论应该消费烤鸭3!
至此不再判断另一种可能了,因为结果都一样。
所以我坚信!是随机唤醒的。
|