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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

wait,notify,notifyAll是Object的方法,需要在同步代码块或同步方法中才可以调用这三个方法?但为什么?
还有在调用notify()All;时前面没有对象,并没有写成obj.notifyAll()的格式,这时候究竟是谁在调用它?
monitor是不是一个对象,是谁创建的,为什么说synchornized之后就拿到monitor了?
哪位大侠能讲讲原理?

评分

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

查看全部评分

3 个回复

倒序浏览
本帖最后由 sanguodouble1 于 2014-3-5 13:42 编辑

谁在调用?就是他自己,因为任何类其实都是Object的子类,如果写成this.wait()就一目了然了吧。
wait()方法,和notify()方法组合使用

这个怎么说呢,举个例子吧:
现在有一个房间(代表一个对象),
房间可以看电视(代表对象里的方法),
有三个路人ABC(代表3个线程),
门锁(代表关键字synchronized),
房东(代表关键字this)

但现在有个情况,就是当有人在看电视的时候,不允许其他人来换台,所以房东为了达到这种目的,就在房门上装了一个锁(就是关键字synchronized)

这时如果你想看电视,就需要这把锁的钥匙,
比如A拿到了这把钥匙,进去看电视了,看了很久,房东说:“你丫的,你都看这么久了,也给别人看一下”,所以就叫A去外面等着,不叫他不许进来。
这种现象,用代码表示,就是this.wait();

然后他把钥匙给了其他在等待的B、C中的其中一个,B力气大,抢到了钥匙。
这种现象,用代码表示,就是this.notify();

又过了一会了,房东说,现在播放新闻联播,你们每人都需要深入学习,就又拿出了两把钥匙,就让房间外面的A和C都进来了
这种现象,用代码表示,就是this.notifyAll();


说到这里,你大概了解了吧,wait()方法,wait的不是对象本身,而是正在访问当前对象的某个线程,同理,notify()方法,叫醒的是等待在这个对象上的线程
而monitor是当前对象的监听器,通过他,可以知道现在哪个线程在访问当前对象

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
sanguodouble1 发表于 2014-3-5 13:40
谁在调用?就是他自己,因为任何类其实都是Object的子类,如果写成this.wait()就一目了然了吧。
wait()方法 ...

monitor是不是锁,线程如何获取对象的monitor的?
回复 使用道具 举报
monitor可以理解成锁,当对象的某一段代码加了synchronized关键字时,当线程访问这段代码时需要取得monitor锁,离开时释放锁
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马