黑马程序员技术交流社区

标题: 线程是否回头判断标记的疑惑,求解析 [打印本页]

作者: 328078121    时间: 2013-8-30 20:05
标题: 线程是否回头判断标记的疑惑,求解析
本帖最后由 328078121 于 2013-8-30 23:12 编辑


内容在毕老师day12-05视频中(20分钟后)有一个判断标记的小细节,就是等待中的线程被唤醒后是否再回头判断标记,如果用if(flag)线程就不回头判断标记,用while(flag)线程就回头判断标记。if的情况好理解,在哪里被唤醒就在哪里接着往下执行;但是在while循环体中被唤醒的线程为什么要回头再判断标记呢?就疑惑在这了,求解析。


作者: 月黑风高    时间: 2013-8-30 21:09
道理就像卖票的那个一样判断flag为真之后,该生产线程wait,wait之后在此醒来也是从判断完成的地方醒来,但此时,flag的值已经被其他运行的线程改变了,再次运行以下代码会打印错误的生产者,消费线程情况类似。
把if(flag)判断更改为while(flag),这样该线程notify()之后由于循环的原因会再次判断flag的值,这样就可以解决线程不同步的问题。

        但是这样会造成一个新的问题就是死锁,循环的加入意味着,循环判断flag的值,经过几次判断之后,生产者没有唤醒消费者,而是唤醒的另一个生产者,生产者再判断flag,这时自己也wait了,此时所有的任务线程全部沉睡在线程池中了,程序停在那儿。所以,这样会造成死锁情况的出现。当然,也可能出现死锁和谐的情况,但是有死锁的话,不一定什么时候程序就停在那儿不动了。

亲,明白了木有?

作者: 王广亚    时间: 2013-8-30 21:17
很简单啊,因为他是放在了while循环里啊,回头判断是while的特性,和线程无关。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2