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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑齐育 中级黑马   /  2013-10-13 16:53  /  1330 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑齐育 于 2013-10-14 10:02 编辑

生产者消费者的视频中进入死锁的原因和如何解除死锁时说要使用notifyAll(),而后面有说使用Lock和Condiction类的signal方法,但是我觉得对于工厂来说,就应该一直运转(也就是应该唤醒全部线程),那么这时用原来的技术和用新技术有区别吗?工作中一般用哪个?两个的效率有什么不同?

评分

参与人数 1技术分 +1 收起 理由
李江 + 1

查看全部评分

4 个回复

倒序浏览
生产者和消费者这个例子讲的是线程同步和锁的问题,现实生活中的道理是:生产者生产产品然后消费者来消费,如果没有此产品,那么消费者就找别的产品来替代。但是这个例子中,如果生产者唤醒的还是生产者,一直没有消费者醒来,那么这个程序中就没有另外一个线程运作了。使用notifyAll会唤醒本方和对方,锁只有一个,那么就会出现都来拿锁,你不让,我也不让,从而出现死锁。如果是用了signal,就不会唤醒本方,而只唤醒对方,这样就不会出现死锁了。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
生产者和消费者也就是线程间的通信:
1,线程间通信。
等待/唤醒机制。
也就是常见的生产者消费者问题。
1.当多个生产者消费者出现时,
需要让获取执行权的线程判断标记。
通过while完成。
2.需要将对方的线程唤醒。
仅仅用notify,是不可以的。因为有可能出现只唤醒本方。
有可能会导致,所有线程都等待。
所以可以通过notifyAll的形式来完成 。
这个程序有一个bug。就是每次notifyAll。都会唤醒本方。可不可以只唤醒对方呢?
JDK1.5版本提供了一些新的对象,优化了等待唤醒机制。
1,将synchronized 替换成了Lock接口。
将隐式锁,升级成了显示锁。
Lock
  获取锁:lock();
  释放锁:unlock();注意:释放的动作一定要执行,所以通常定义在finally中。
  获取Condition对象:newCondition();
2,将Object中的wait,notify,notifyAll方法都替换成了Condition的await,signal,signalAll。
和以前不同是:一个同步代码块具备一个锁,该所以具备自己的独立wait和notify方法。
现在是将wait,notify等方法,封装进一个特有的对象Condition,而一个Lock锁上可以有多个Condition对象。

评分

参与人数 1技术分 +1 收起 理由
To + 1

查看全部评分

回复 使用道具 举报
生产者消费者这个例子就是讲两个线程操作同一个资源。死锁的话,其实毕姥爷的那个筷子的比喻打的相当好,一人一只筷子。执行权一直分配稳定的话就和谐了  要是俩线程都互不相让的话就等在哪里~~~
回复 使用道具 举报
To 金牌黑马 2013-10-14 09:49:51
报纸
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马