黑马程序员技术交流社区

标题: 毕老师讲的生产者消费者问题中的if换成while后,为什么线程的行为会发生变化? [打印本页]

作者: 吴建昆    时间: 2013-5-1 14:52
标题: 毕老师讲的生产者消费者问题中的if换成while后,为什么线程的行为会发生变化?
毕老师讲多线程之间的通信时,讲生产者消费者问题,其中有这样一段代码
  1. public synchronized void set(String name)
  2.         {
  3.                 if(flag)
  4.                         try{this.wait();}catch(Exception e){}//t1(获取资格)  t2(放弃资格)
  5.                 this.name = name+"--"+count++;

  6.                 System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
  7.                 flag = true;
  8.                 this.notifyAll();
  9.         }
复制代码
说if(flag) try{this.wait();}catch(Exception e){}//t1(获取资格)  t2(放弃资格)
这句,如果刚开始t1获取执行资格,执行生产代码后把flag置为true,再把t2唤醒,然后自己进入等待状态,此时t2会从等待的位置直接向下走,做出生产动作,而不会判断if语句中flag的值。结果造成连续生产两次的错误。到这里我是理解的。但下面就想不通了。
   老师把if换成了while,即while(flag) try{this.wait();}catch(Exception e){}//t1(获取资格)  t2(放弃资格)
这个时候为什么t2被唤醒后不继续向下执行了,而去读取while中flag的值了呢?





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