精华帖 (3) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (6)
|
|
---|---|
作者 | 正文 |
发表时间:2011-07-05
taolei0628 写道 [quote="AngelAndAngel
兄弟你说的肯定是对的,不过假如用this,等于是得到本对象的锁,那么其他线程对本对象的同步方法会被暂时阻塞,假如操作的时间比较长那么阻塞的时间应该也会很长。还有,我觉得多个对象锁来判断应该是有最佳实践或者最适合做什么样的东西的,但是我目前还不太了解,兄弟你发点看法咯。 你不就在做一个BlockingQueue吗?this 和 内部对象没什么区别啊,你也可以不用this.就用那个notEmpty同一个对象。只不过你已经把那个变量起了个notEmpty的名字,我不好用它来解释notFull啊。 哦哦 呵呵 理解你意思了 是我专牛角尖了 |
|
返回顶楼 | |
发表时间:2011-07-05
楼主这个死锁是自己给自己找的麻烦,用不着notEmpty theMaxObject
解决办法就是:把两个锁搞成一个锁 |
|
返回顶楼 | |
发表时间:2011-07-05
悲剧了 写道 楼主这个死锁是自己给自己找的麻烦,用不着notEmpty theMaxObject
解决办法就是:把两个锁搞成一个锁 我知道这个肯定会死锁 但是我不觉得这是给自己找个麻烦 |
|
返回顶楼 | |
发表时间:2011-07-05
AngelAndAngel 写道 悲剧了 写道 楼主这个死锁是自己给自己找的麻烦,用不着notEmpty theMaxObject
解决办法就是:把两个锁搞成一个锁 我知道这个肯定会死锁 但是我不觉得这是给自己找个麻烦 死锁是要要花费时间设计避免的,这是没办法的事 |
|
返回顶楼 | |
发表时间:2011-07-05
看了你的代码其实就是一个生产者消费者问题,不过你对待临界条件时候后的处理貌似有问题,应该使用while(xxx.size()==0) obj.wait();而不是用if做一次判断,这样来做,因为当使用notifyAll时唤醒的线程这个时候不知道是否还满足xxx.size()==0的条件,肯能造成仓库没有货而取出货的情况
|
|
返回顶楼 | |
发表时间:2011-07-05
看起来像刚学习java的synchronized的时候做的事情~~
不过这句很经典: “如果没有任务会阻塞,那么单处理器机器上使用并发就没有任何意义。”也就是用并发的本质原因 |
|
返回顶楼 | |
发表时间:2011-07-05
blackbeans 写道 看了你的代码其实就是一个生产者消费者问题,不过你对待临界条件时候后的处理貌似有问题,应该使用while(xxx.size()==0) obj.wait();而不是用if做一次判断,这样来做,因为当使用notifyAll时唤醒的线程这个时候不知道是否还满足xxx.size()==0的条件,肯能造成仓库没有货而取出货的情况
你前面一句话是对的 这只是个示例 后句话你自己用程序试试就知道了。 |
|
返回顶楼 | |
发表时间:2011-07-05
最后修改:2011-07-05
snake1987 写道 看起来像刚学习java的synchronized的时候做的事情~~
不过这句很经典: “如果没有任务会阻塞,那么单处理器机器上使用并发就没有任何意义。”也就是用并发的本质原因 因为看到过多个对象锁实现功能,但总觉得死锁不可避免 兄弟留下的痕迹太少了 我看不出对这个问题有好的回答。还有我觉得任何简单的程序都有最佳实践 对么,估计这方面你应该了解比较深入,能否把你的心得体会写出来。 |
|
返回顶楼 | |
发表时间:2011-07-05
2中解决方法:
1.使用并发包中的阻塞队列 2.使用两个对象锁,notEmpty,notFull来做(注意顺序) 不会写,去看温少的并发教程 有空多看看源码,多搜搜资料,别一有问题就问别人 |
|
返回顶楼 | |
发表时间:2011-07-05
为什么生产工发现仓库没有物品了会去唤醒搬运工,,,,而不是放完产品后再唤醒呢
|
|
返回顶楼 | |