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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 思考。。。 中级黑马   /  2015-6-29 16:00  /  405 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public synchronized void set(String name)
  2.         {
  3.                 while(flag)
  4.                         try{this.wait();}catch(Exception e){}//t1(放弃资格)  t2(获取资格)
  5.                 this.name = name+"--"+count++;

  6.                 System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
  7.                 flag = true;
  8.                 this.notifyAll();
  9.         }


  10.         //  t3   t4  
  11.         public synchronized void out()
  12.         {
  13.                 while(!flag)
  14.                         try{wait();}catch(Exception e){}//t3(放弃资格) t4(放弃资格)
  15.                 System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);
  16.                 flag = false;
  17.                 this.notifyAll();
  18.         }
复制代码

如上代码,我想请问的是,如果用notifyAll()唤醒所有的线程,那么线程t3,t4一起被唤醒了,那么还是会存在连续两次打印输出System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name)的情况吧,为什么?

评分

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

查看全部评分

2 个回复

倒序浏览
你不是有标志变量吗,他也控制线程的
回复 使用道具 举报
qxc1281 发表于 2015-6-30 08:17
你不是有标志变量吗,他也控制线程的

是有标志变量flag了,但是那时的标志变量是true了,所以我在想t3,t4线程都被唤醒后,它们都有可能一起往下执行了,那就有可能出现连续两次打印输出System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name)的情况,这是我的理解,还是想不通呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马