假设一个生产者生产一个产品,两个消费者A,B去取这个商品。

使用if:

A去取商品,发现空,于是等待...

B去取商品,发现空,于是等待...

生产者生产商品,唤醒他们

B先争到锁,从wait()后执行代码,跳出if,取走商品。

A后争到锁,从wait()处出发,跳出if,发现竟然没东西,取东西失败,越界。

结果

synchronized中判断条件用while而不是if

 

改用while

A去取商品,发现空,于是等待...

B去取商品,发现空,于是等待...

生产者生产商品,唤醒他们

B先争到锁,从wait()后执行代码,再次执行while,发现不必进入while,于是取走商品。

A后争到锁,从wait()处出发,再次执行while,符合循环条件,等待。

 结果

synchronized中判断条件用while而不是if

代码生产者

 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 }
View Code

相关文章:

  • 2021-09-01
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-23
  • 2021-12-23
猜你喜欢
  • 2022-12-23
  • 2021-09-09
  • 2021-10-13
  • 2022-12-23
  • 2022-12-23
  • 2021-10-23
  • 2021-10-13
相关资源
相似解决方案