A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程洋 中级黑马   /  2013-12-15 09:21  /  910 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题不是出在代码上,在毕老师分析多个生产者消费者时,下面这段代码容易出现生产多个消费一个或是生产一个消费多个的问题,问题的原因也就不说了,我的问题是:当生产者生产了一次,若是他还有执行权,他执行到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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

2 个回复

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

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马