黑马程序员技术交流社区
标题:
毕老师讲的生产者消费者问题中的if换成while后,为什么线程的行为会发生变化?
[打印本页]
作者:
吴建昆
时间:
2013-5-1 14:52
标题:
毕老师讲的生产者消费者问题中的if换成while后,为什么线程的行为会发生变化?
毕老师讲多线程之间的通信时,讲生产者消费者问题,其中有这样一段代码
public synchronized void set(String name)
{
if(flag)
try{this.wait();}catch(Exception e){}//t1(获取资格) t2(放弃资格)
this.name = name+"--"+count++;
System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
flag = true;
this.notifyAll();
}
复制代码
说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