A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 328078121 于 2013-8-30 23:12 编辑


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

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

2 个回复

正序浏览
很简单啊,因为他是放在了while循环里啊,回头判断是while的特性,和线程无关。
回复 使用道具 举报
道理就像卖票的那个一样判断flag为真之后,该生产线程wait,wait之后在此醒来也是从判断完成的地方醒来,但此时,flag的值已经被其他运行的线程改变了,再次运行以下代码会打印错误的生产者,消费线程情况类似。
把if(flag)判断更改为while(flag),这样该线程notify()之后由于循环的原因会再次判断flag的值,这样就可以解决线程不同步的问题。

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

亲,明白了木有?

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马