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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘俊佳 中级黑马   /  2012-8-16 09:33  /  2826 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

以下是毕老师视频里面讲到的生产者与消费者程序里面类Resource的代码:
  1. package thread2;

  2. public class Resource {
  3. private String name;
  4. private int count = 1;
  5. private boolean flag = false;

  6. public synchronized void set(String name) {
  7. while(flag)
  8. try {
  9. this.wait();
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. this.name = name + "--" + count++;
  14. System.out.println(Thread.currentThread().getName() + "...生产者..."
  15. + this.name);
  16. flag=true;
  17. this.notifyAll();

  18. }

  19. public synchronized void out() {
  20. while(!flag)
  21. try {
  22. this.wait();
  23. } catch (InterruptedException e) {
  24. e.printStackTrace();
  25. }
  26. System.out.println(Thread.currentThread().getName() + "...消费者..."
  27. + this.name);
  28. flag=false;
  29. this.notifyAll();
  30. }

  31. }
复制代码
这段代码里面中循环判断标记这一块我有疑问,毕老师视频里是说:
假设当t1获得CPU执行权的时候,t1判断标记为假,它不需要等待,它就往里面赋了一个值,然后count++一次,再打印
如果它赋的值是130,那么假设它打印的是Thread-0...生产者...+商品+--130(当然,有可能也会是Thread-1...生产者...+商品+--130),
即表示生产了一次,生产完以后,就把标记置为真了,然后执行notify,notify完以后,它这时是还有执行权的,
然后去再次判断,一看flag为true,它于是就等着,这时t2,t3,t4都有可能抢到CPU执行权,假设t2抢到了,它于是去判断标记,
一看为真,于是它也就等着了,这时只剩下t3和t4了,t3一进来判断标记!flag为假,不需要等,即消费了一次,到目前为止,这属于正常消费,
即生产一次,消费一次,消费完了以后,它就把标记置为false了。
这里t3抢到执行权以后,当它判断标记的时候,应该是!flag为真才对啊,因为只有仓库里面有商品的时候,它才能消费吧?



4 个回复

倒序浏览
我感觉没什么问题呀
1,假设t1拿到执行权,此时flag=false的时候,判断标记为假,于是乎t1就去生产了,t2,t3,t4由于又锁所以在外面等着
2,t1执行完了以后,将flag置为true,并唤醒所有的线程去抢执行权
3,t2抢到了因为flag为true所以继续等
4,t3或则t4抢到了执行权后,消费一次,将flag置为false,并唤醒其他线程
5,就算t4抢到了执行权,但是!flag为真,所以它也只能等着,所以只剩下t1,t2去生产了
这不是很正常的生产一次,消费一次么?
至于你说的:"这里t3抢到执行权以后,当它判断标记的时候,应该是!flag为真才对啊,因为只有仓库里面有商品的时候,它才能消费吧?"
t3抢到执行权以后,它的钱会先去判断标志,标志flag为true代表有货,为false代表没货,那如果!flag为真的话,则此时仓库的确是没货的,t3只能等待了,等t1,t2去生产了,它才能消费

你的上面理解都是正确,你最后的疑问感觉是你自己误导了自己,可以再去想想,是没有问题的!
回复 使用道具 举报
这里t3抢到执行权以后,当它判断标记的时候,应该是!flag为真才对啊,因为只有仓库里面有商品的时候,它才能消费吧?--------------------------------------------这里毕老师是把仓库有货设为true(flage为真),没货设为false(flage为假),按你说的(t3抢到执行权以后,当它判断标记的时候,应该是!flag为真才对啊)!flage为真,那是不是flage为假啊,既然flage为假,是不是代表仓库里面没货啊?没货消费者怎样消费啊.......
回复 使用道具 举报
毕老师的意思是t3(!flag)为假,这时flag为真。flag才是判断仓库有没有货的依据。
回复 使用道具 举报
谢谢楼上的各位解答,问题已经解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马