因为用的不是while(flag),不是while(){}结构,所以不会循环。
带你走一遍思路,你就明白了!
开始t1执行后,生产一个商品,flag为true,1放弃资格,t2判断flag为true,t2放弃资格。t3开始执行,判断flag为true,消费一个商品,flag为false, t4判断flag为false, t4放弃资格
当t1获得执行权后,执行完后flag为true,生产一个商品,唤醒了t2 。t1放弃资格,t2就直接往下执行了,然后又输出一个“生产者”,所以出现了生产两个商品的情况。
解决的方法就是将if改为while结构后,t2就不会再生产了,直接放弃资格,最后导致全部等待,所以要把this.notify()改为this.notifyAll()就可以解决了。 |