黑马程序员技术交流社区
标题:
调用wait,notify,notifyAll方法的对象是什么?
[打印本页]
作者:
徐芾清
时间:
2014-3-5 07:54
标题:
调用wait,notify,notifyAll方法的对象是什么?
wait,notify,notifyAll是Object的方法,需要在同步代码块或同步方法中才可以调用这三个方法?但为什么?
还有在调用notify()All;时前面没有对象,并没有写成obj.notifyAll()的格式,这时候究竟是谁在调用它?
monitor是不是一个对象,是谁创建的,为什么说synchornized之后就拿到monitor了?
哪位大侠能讲讲原理?
作者:
sanguodouble1
时间:
2014-3-5 13:40
本帖最后由 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是当前对象的监听器,通过他,可以知道现在哪个线程在访问当前对象
作者:
徐芾清
时间:
2014-3-7 09:31
sanguodouble1 发表于 2014-3-5 13:40
谁在调用?就是他自己,因为任何类其实都是Object的子类,如果写成this.wait()就一目了然了吧。
wait()方法 ...
monitor是不是锁,线程如何获取对象的monitor的?
作者:
sanguodouble1
时间:
2014-3-7 10:57
monitor可以理解成锁,当对象的某一段代码加了synchronized关键字时,当线程访问这段代码时需要取得monitor锁,离开时释放锁
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2