黑马程序员技术交流社区
标题:
if 和while的区别
[打印本页]
作者:
萧萧北
时间:
2013-6-4 11:34
标题:
if 和while的区别
本帖最后由 萧萧北 于 2013-6-5 09:01 编辑
public synchronized void set(String name)
{
// t1 t2
if(flag) //while(flag)
try {this.wait();} catch (Exception e) {} //t1 放弃资格
this.name=name+"--"+count++;
System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
flag=true;
this.notifyAll(); //一般唤醒线程池中第一个
}
复制代码
第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