黑马程序员技术交流社区

标题: 生产者消费者的疑问 [打印本页]

作者: 程洋    时间: 2013-12-15 09:21
标题: 生产者消费者的疑问
问题不是出在代码上,在毕老师分析多个生产者消费者时,下面这段代码容易出现生产多个消费一个或是生产一个消费多个的问题,问题的原因也就不说了,我的问题是:当生产者生产了一次,若是他还有执行权,他执行到wait时,会停下来(放弃执行权),这个时候这个生产者会放弃锁吗?如果不放弃这个程序不会执行下去的,如果放弃锁,是wait让他放弃的吗?
  1. class Res
  2. {
  3.         private String name;
  4.         private int count=1;
  5.         private boolean flag=false;
  6.         public synchronized void set(name)
  7.         {
  8.                 if(flag)
  9.                         try
  10.                         {
  11.                                 wait();
  12.                         }
  13.                         catch(Exception e)
  14.                         {}
  15.                 this.name=name+"......"+count++;
  16.                 System.out.println(Thread.currentThread().getName()+"....生产者..."+this.name)
  17.                 flag=true;
  18.                 notify();
  19.         }
  20.         public synchronized void out()
  21.         {
  22.                 if(flag)
  23.                         try
  24.                                 {
  25.                                         wait();
  26.                                 }
  27.                                 catch(Exception e)
  28.                                 {}
  29.           System.out.println(Thread.currentThread().getName()+"....消费者..."+this.name)
  30.                 flag=flag;
  31.                 notify();
  32.         }
  33. }
复制代码

作者: 回音    时间: 2013-12-15 09:53
wait()是Object的方法,所有对象都会继承这个方法。某个线程调用wait()方法,它会放弃运行,进入等待状态,同时放弃对象锁,其它线程就可以进入由同一个对象锁控制的同步块或同步方法。
作者: kongling    时间: 2013-12-16 23:39
wait():
     等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则编译可以通过,但运行时会收到一个异常:IllegalMonitorStateException。
     调用任意对象的 wait() 方法导致该线程阻塞,该线程不可继续执行,并且该对象上的锁被释放。
notify():
     唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
     调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。




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