黑马程序员技术交流社区

标题: if 和while的区别 [打印本页]

作者: 萧萧北    时间: 2013-6-4 11:34
标题: if 和while的区别
本帖最后由 萧萧北 于 2013-6-5 09:01 编辑
  1. public synchronized void set(String name)
  2. {
  3. // t1 t2
  4. if(flag)     //while(flag)   
  5. try {this.wait();} catch (Exception e) {} //t1 放弃资格
  6. this.name=name+"--"+count++;
  7. System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
  8. flag=true;
  9. this.notifyAll(); //一般唤醒线程池中第一个
  10. }
复制代码
第12天视频中 ,将if判断改为while判断,不太明白这里if 和while的区别,请大家都来结合具体题目说说这是怎么回事,为什么非得使用while?
作者: 画饼    时间: 2013-6-4 11:56
增加安全性。。防止伪唤醒
作者: 胡晓思    时间: 2013-6-4 12:21
使用if的话 只会判断一次  while是一个循环判断 就是说当前线程执行完同步代码后  还能有机会回到while语句再次判断  和别的等待的线程竞争 争夺执行  楼主觉得这样说是否合理
作者: 小羽天空    时间: 2013-6-4 13:12
lz 你这是两个生产者两个消费者的问题,至于为什么用while不用if,那是因为当你其中一个生产者t1进入等待状态wait()时而t2在执行下面程序时this.name=name+"--"+count++;(假如count=1),执行完后flag=true他也进入等待中,这时t1,t2都在线程池中等待,而t2是先进去的,等到下一次消费者唤醒线程池this.notify();时t2先醒来,t2的位置在try {this.wait();} catch (Exception e) {}这里,醒来后是if(flag),他就不会再去判断flag是否还是true就继续执行this.name=name+"--"+count++;这导致生产者一下生产了两(本题原意是生产一个消费一个吧,楼主)    醒来后是while(flag) ,他就会在判断flag,这时他知道flag为true就不会在生产。

不知道楼主是否能明白我的意思,其实毕老师day12-5视频中讲得很清楚,你可以多看几遍,还有指出lz你的一个小错误:09.this.notifyAll(); //一般唤醒线程池中的所有线程不是一个;this.notify();才是唤醒线程池中第一个。
作者: 刘晓    时间: 2013-6-4 22:10
很简洁的说,就是if只判断一次,而while是判断一次后,进入循环,再次判断。而此处需要再次判断。




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