毕老师讲多线程之间的通信时,讲生产者消费者问题,其中有这样一段代码- 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的值了呢?
|