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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邝雄伟 中级黑马   /  2013-1-31 19:51  /  2413 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-2-3 11:56 编辑

wait()方法和sleep()方法不同的是,wait方法释放执行权同时释放锁,sleep方法释放执行权但是不释放锁。
现在问题是,当wait方法被notify唤醒后还持有锁吗??
按照毕老师第12天第05视频14分钟左右讲的意思,wait方法被notify唤醒后,锁仍然是释放状态的,但是不是很明白,求解析

评分

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

查看全部评分

6 个回复

倒序浏览
把代码放出来
回复 使用道具 举报
wait()方法:
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
当前线程必须拥有此对象的锁。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来然后该线程将等到重新获得对监视器的所有权(锁)后才能继续执行。

这是api文档的原话,wait()方法被唤醒,还需持有锁才能执行!

评分

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

查看全部评分

回复 使用道具 举报
SLEEP(10)  sleep是设置时间 时间到自动解开了
wai()  是挂机的意思 不要理解什么释放锁 锁在synchronized的才有这个概念  这里叫监视器 notify()唤醒后 wait()就结束了
回复 使用道具 举报
我是这么理解的。在多线程操作中,一个线程如果是用了wait()方法,该线程就会释放锁(所谓的锁就是线程的执行权,也就是cpu的执行权),之后进入线程池等待,这时其他在线程池中的线程就会一拥而上,抢夺cup的执行权,谁抢到了由谁运行,该线程如果被notifuy方法唤醒后,之后不会立即获得锁,在单核cpu的硬件配置中只有当其他线程释放cpu执行资源时或者其他线程wait()时,才会和其他线程一起去抢夺cpu的执行权,谁的优先级最高,抢到的概率就最大,抢到就抢到了,没抢到你就继续等着吧,与sleep()方法不同的是,线程在使用sleep()方法睡眠期间,不会释放锁,也就是我不执行,别人也别想得到执行。

评分

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

查看全部评分

回复 使用道具 举报
同意楼上观点
回复 使用道具 举报
wait()
          在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
sleep(long millis)
          在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马