黑马程序员技术交流社区

标题: 关于多线程同步锁中等待唤醒的问题思考 [打印本页]

作者: 九号球    时间: 2014-6-10 16:50
标题: 关于多线程同步锁中等待唤醒的问题思考
本帖最后由 九号球 于 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行位置,但是始终在加锁代码块中,所以这个线程从等待到被唤醒这一过程中,锁的持有者是怎么变化的呢?
如果是在等待时释放锁,被唤醒后重新抢夺控制权再持有锁。那么被唤醒的线程位置是代码第四行,他已经在被锁代码中了,这又怎么解释呢?





作者: HF_Opticalix    时间: 2014-6-10 22:16
wait方法:释放资源、释放锁。
被notify唤醒后,回到第4行之前要先在第3行判断,flag被改过了所以直接执行第5行。
不是在被锁代码中,只是重新持有锁吧
作者: HF_Opticalix    时间: 2014-6-10 22:17
wait方法:释放资源 释放锁--见Day12视频开头
被notify唤醒后 回到第四行也要先判断flag的 因为在while代码中
我理解是重新持有锁 不是在被锁代码中

作者: 九号球    时间: 2014-6-10 23:12
HF_Opticalix 发表于 2014-6-10 22:17
wait方法:释放资源 释放锁--见Day12视频开头
被notify唤醒后 回到第四行也要先判断flag的 因为在while代码 ...

我也觉得是重新持有锁的,但是从逻辑上来说不通啊,线程是在被锁代码中进入等待的,难道被唤醒后要重新从被锁代码外判断么
作者: java木    时间: 2014-6-11 00:03
思考问题不要太表面语义化了
作者: 九号球    时间: 2014-6-11 00:28
java木 发表于 2014-6-11 00:03
思考问题不要太表面语义化了

解释一下,别丢下一句这么表面语义化的句子就走




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2