黑马程序员技术交流社区

标题: 同步函数中,不加循环也能重复执行,是为什么 [打印本页]

作者: 余琪琪    时间: 2014-6-15 21:56
标题: 同步函数中,不加循环也能重复执行,是为什么
本帖最后由 余琪琪 于 2014-6-15 23:06 编辑
  1. class Res
  2. {
  3.         private String name;
  4.         private int count = 1;

  5.         //定义标记。
  6.         private boolean flag;
  7.         //提供了给商品赋值的方法。
  8.         public synchronized void set(String name)
  9.         {
  10.                 if(flag)//判断标记为true,执行wait。等待。为false。就生产。
  11.                         try{this.wait();}catch(InterruptedException e){}
  12.                 this.name  = name + "--" + count;

  13.                 count++;

  14.                 System.out.println(Thread.currentThread().getName()+"...生产者....."+this.name);
  15.                 //生成完毕,将标记改为true。
  16.                 flag = true;

  17.                 //唤醒消费者。
  18.                 this.notify();
  19.         }

  20.         //提供一个获取商品的方法。
  21.         public synchronized void get()
  22.         {
  23.                 if(!flag)
  24.                         try{this.wait();}catch(InterruptedException e){}
  25.                 System.out.println(Thread.currentThread().getName()+".......消费者....."+this.name);

  26.                 //将标记改为false。
  27.                 flag = false;
  28.                 //唤醒生产者。
  29.                 this.notify();
  30.         }
  31. }


  32. //生成者。
  33. class Producer implements Runnable
  34. {
  35.         private Res r;
  36.         Producer(Res r)
  37.         {
  38.                 this.r = r;
  39.         }
  40.         public void run()
  41.         {
  42.                 while(true)
  43.                         r.set("面包");
  44.         }
  45. }

  46. //消费者
  47. class Consumer implements Runnable
  48. {
  49.         private Res r;
  50.         Consumer(Res r)
  51.         {
  52.                 this.r = r;
  53.         }
  54.         public void run()
  55.         {        
  56.                 while(true)
  57.                         r.get();
  58.         }
  59. }




  60. class  ProducerConsumerDemo2
  61. {
  62.         public static void main(String[] args)
  63.         {
  64.                 //1,创建资源。
  65.                 Res r = new Res();
  66.                 //2,创建两个任务。
  67.                 Producer pro = new Producer(r);
  68.                 Consumer con = new Consumer(r);

  69.                 //3,创建线程。
  70.                 Thread t1 = new Thread(pro);
  71.                 Thread t2 = new Thread(con);

  72.                 t1.start();
  73.                 t2.start();
  74.         }
  75. }
复制代码

作者: Alan_Kwan    时间: 2014-6-15 21:59
本帖最后由 Alan_Kwan 于 2014-6-15 22:02 编辑

首先回答你的问题:Producer和Consumer类里面的run方法的while(true)做了无限循环。

然后你这个代码是有问题的,当你创建多个producer对象和Consumer对象之后你就会发现问题所在。解决方法是使用JDK5.0更新的一个新特性Lock类。

作者: alive    时间: 2014-6-15 22:01
楼上正答
作者: yinxjfly    时间: 2014-6-23 10:38
控制循环是在run方法的while循环中,与同步没有关系,同步只是保证了资源的唯一性和动作的互斥性!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2