为什么wait()和notify()属于Object类
Posted 一个java小生的奋斗史
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么wait()和notify()属于Object类相关的知识,希望对你有一定的参考价值。
关于wait()暂停的是持有锁的对象,所以想调用wait()必须为:对象.wait();
notify()唤醒的是等待锁的对象,调用:对象.notify();
如下:
Object obj = newObject();
synchronized(obj){
try{
obj.wait();
}catch(Exception e){}
obj.notify();
}
注意:wait(),notify(),notifyAll()都必须使用在同步中,因为要对持有监视器(锁)的线程操作。所以要使用在同步中,因为只有同步 才具有锁。
为什么这些操作线程的方法要定义在object类中呢?
简单说:因为synchronized中的这把锁可以是任意对象,所以任意对象都可以调用wait()和notify();所以wait和notify属于Object。
专业说:因为这些方法在操作同步线程时,都必须要标识它们操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。
也就是说,等待和唤醒必须是同一个锁。而锁可以是任意对象,所以可以被任意对象调用的方法是定义在object类中。
以上是关于为什么wait()和notify()属于Object类的主要内容,如果未能解决你的问题,请参考以下文章
线程等待机制——wait/notify(notifyAll)
线程等待机制——wait/notify(notifyAll)
wait(),notify(),notifyAll()的理解与使用
JUC并发编程 -- 为什么需要wait/notify方法 & 原理之 wait / notify & wait() 和 notify() API介绍
Java-JUC:使用Lock替换synchronized,使用Condition的await,singal,singalall替换object的wait,notify,notifyall实现线(代码