黑马程序员技术交流社区

标题: 线程间通信-等待唤醒机制没太听懂 [打印本页]

作者: qmlovewhr    时间: 2013-7-1 14:19
标题: 线程间通信-等待唤醒机制没太听懂
为什么这些操作线程的方法要定义 在上帝类object类中呢?
作者: 蚂蚁搬家    时间: 2013-7-1 14:53
wait和notify、notifyAll方法都必须在同步代码块中使用,就是要用到使用synchronized关键字修饰的代码中,这些代码都要使用锁;
wait、notify和notifyAll方法在使用时都要判断锁,只有使用同一个锁的notify才能唤醒wait的线程;

普通方法的锁是this指针,即调用这个方法的对象;
静态方法的锁是该静态方法所在的类;
代码块的锁是任意的对象,即synchronized(Object obj);
由以上可以看出,锁可以是任意类型的对象,而wait等3个方法要使用任意类型的对象,他们就必须是超父类Object中的成员了,任意对象都默认继承Object,也就是任意对象中都有wait等方法了;
作者: 阿凡提不买驴    时间: 2013-7-1 15:02
举个例子:wait()—notify()等方法都是基于条件对象的,只可以由拿到锁的线程调用,而线程也是通过对象来实现的,这些方法需要通过操作当前代码的对象来调用,而类都可以通过继承借口Runnable()来实现多线程操作的代码,这样每个类的对象在需要同步问题时候,就可以通过调用wait()—notify()等方法来实现,你可以参阅下ReentrantLockle类,这个相对容易明白些,希望对你有所帮助,如有不对的地方还请点评!
作者: 阿凡提不买驴    时间: 2013-7-1 15:28
蚂蚁搬家 发表于 2013-7-1 14:53
wait和notify、notifyAll方法都必须在同步代码块中使用,就是要用到使用synchronized关键字修饰的代码中, ...

wait()、notify()、notifyAll()还需要判断锁?貌似是线程判断锁,使用该线程的对象.wait()等方法,来让线程等待?我也混淆了
作者: 哪颗最亮的星星    时间: 2013-7-1 16:04
    因为这些方法在操作同步中线程时,都必须要标识它们所操作线程持有的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒。
             不可以对不同锁中的线程唤醒。   也就是说,等待和唤醒必须是同一个锁。
作者: qmlovewhr    时间: 2013-7-2 09:36
谢谢啦,我再多看两遍




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