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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 九号球 于 2014-6-10 16:53 编辑

在毕老师关于生产消费者的代码中
  1. public synchronized void out()
  2.         {
  3.                 while(!flag)
  4.                         try{this.wait();}catch(InterruptedException e){}
  5.                 System.out.println(Thread.currentThread().getName()+"...消费者........"+this.name)
  6.                 flag = false;
  7.                 notifyAll();
  8.         }
复制代码


当!flag为假的时候,线程等待,此线程停止在第4行位置,但是始终在加锁代码块中,所以这个线程从等待到被唤醒这一过程中,锁的持有者是怎么变化的呢?
如果是在等待时释放锁,被唤醒后重新抢夺控制权再持有锁。那么被唤醒的线程位置是代码第四行,他已经在被锁代码中了,这又怎么解释呢?




5 个回复

正序浏览
java木 发表于 2014-6-11 00:03
思考问题不要太表面语义化了

解释一下,别丢下一句这么表面语义化的句子就走
回复 使用道具 举报
思考问题不要太表面语义化了
回复 使用道具 举报
HF_Opticalix 发表于 2014-6-10 22:17
wait方法:释放资源 释放锁--见Day12视频开头
被notify唤醒后 回到第四行也要先判断flag的 因为在while代码 ...

我也觉得是重新持有锁的,但是从逻辑上来说不通啊,线程是在被锁代码中进入等待的,难道被唤醒后要重新从被锁代码外判断么
回复 使用道具 举报
wait方法:释放资源 释放锁--见Day12视频开头
被notify唤醒后 回到第四行也要先判断flag的 因为在while代码中
我理解是重新持有锁 不是在被锁代码中
回复 使用道具 举报
wait方法:释放资源、释放锁。
被notify唤醒后,回到第4行之前要先在第3行判断,flag被改过了所以直接执行第5行。
不是在被锁代码中,只是重新持有锁吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马