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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ↙五线谱╲ 中级黑马   /  2013-12-5 20:28  /  880 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文



Thread-2__消费者___名称:洗衣服1782
Thread-0__生产者__名称:洗衣服1783
Thread-3__消费者___名称:洗衣服1783
Thread-1__生产者__名称:洗衣服1784
经常打印出的是先有消费者后有生产者,应该是先有生产者后有消费者的,是什么原因出现先消费后生产的呢?

4 个回复

倒序浏览

多线程的安全问题
建议再看多一遍老毕关于生产者消费者的视频,专门讲你这问题
回复 使用道具 举报
1、在资源类中定义一个boolean类型的标识位flag,初始值为false,表示没有资源
2、在生产者执行的代码中添加循环判断操作,若flag为false,则说明没有资源,可以继续执行,生产操作执行完后将flag改为true,并唤醒消费者,若flag为true,则说明已有资源,等待
3、在消费者执行代码中添加循环判断操作,若flag为false,则说明没有资源,等待,若为true,则说明已有资源,可以继续执行,消费操作执行后将flag改为true,并唤醒生产者
这样就可以保证先让生产者执行操作,再让消费者执行操作

评分

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

查看全部评分

回复 使用道具 举报
你这问题太粗心了,视频里讲的synchronized 就是对付你这个问题的。多看几遍视频吧,
加了锁后
标记为真,让生产者进去。因为标记为真,消费者等待
生产者出来,标记为假。因为标记为假,消费者进入
消费者取出,标记为真,因为标记为真,生产者进入
。。。。。。用while循环实现,你能用代码把我的中文替换就过关了。
因为当时一看视频我就想到厕所,结果毕老师还真举例厕所,我记忆很深。

视频里的关键字: 双重判断解决,synchronized效率低的问题。
代码视频里就有,相信你也练习了才会有疑惑,我就不贴了。
这是一个关于思路的问题,不在代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
加个标记
标记为真,让生产者进去。因为标记为真,消费者等待。
生产者出来,标记为假。因为标记为假,消费者进入。
消费者取出,标记为真,因为标记为真,生产者进入。

还有注意:
if判断标记,只有一次,会导致不该运行的线程运行了。出现了数据错误的情况。
while判断标记,解决了线程获取执行权后,是否要运行!

notify:只能唤醒一个线程,如果本方唤醒了本方,没有意义。而且while判断标记+notify会导致死锁。
notifyAll解决了本方线程一定会唤醒对方线程的问题。

评分

参与人数 1黑马币 +3 收起 理由
简★零度 + 3

查看全部评分

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