假设一个生产者生产一个产品,两个消费者A,B去取这个商品。
使用if:
A去取商品,发现空,于是等待...
B去取商品,发现空,于是等待...
生产者生产商品,唤醒他们
B先争到锁,从wait()后执行代码,跳出if,取走商品。
A后争到锁,从wait()处出发,跳出if,发现竟然没东西,取东西失败,越界。
结果
改用while
A去取商品,发现空,于是等待...
B去取商品,发现空,于是等待...
生产者生产商品,唤醒他们
B先争到锁,从wait()后执行代码,再次执行while,发现不必进入while,于是取走商品。
A后争到锁,从wait()处出发,再次执行while,符合循环条件,等待。
结果
代码生产者
1 package whileinsyn; 2 3 import java.util.List; 4 5 public class addsir implements Runnable{ 6 private List<String> list; 7 public addsir(List<String> list) { 8 this.list=list; 9 } 10 11 @Override 12 public void run() { 13 // TODO Auto-generated method stub 14 synchronized(list) { 15 System.out.println("生产者生产食品中..."); 16 try { 17 Thread.sleep(1000); 18 } catch (InterruptedException e) { 19 // TODO Auto-generated catch block 20 e.printStackTrace(); 21 } 22 list.add("食品哈哈哈"); 23 System.out.println("已生产完毕食品哈哈哈.*&*."); 24 list.notifyAll(); 25 } 26 27 System.out.println("生产者今日生产量已完成..."); 28 } 29 30 }