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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qmlovewhr 中级黑马   /  2013-7-1 14:19  /  1677 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么这些操作线程的方法要定义 在上帝类object类中呢?

6 个回复

倒序浏览
wait和notify、notifyAll方法都必须在同步代码块中使用,就是要用到使用synchronized关键字修饰的代码中,这些代码都要使用锁;
wait、notify和notifyAll方法在使用时都要判断锁,只有使用同一个锁的notify才能唤醒wait的线程;

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

wait()、notify()、notifyAll()还需要判断锁?貌似是线程判断锁,使用该线程的对象.wait()等方法,来让线程等待?我也混淆了
回复 使用道具 举报
    因为这些方法在操作同步中线程时,都必须要标识它们所操作线程持有的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒。
             不可以对不同锁中的线程唤醒。   也就是说,等待和唤醒必须是同一个锁。
回复 使用道具 举报
谢谢啦,我再多看两遍
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马