为什么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()的理解与使用

wait和notify

JUC并发编程 -- 为什么需要wait/notify方法 & 原理之 wait / notify & wait() 和 notify() API介绍

Java-JUC:使用Lock替换synchronized,使用Condition的await,singal,singalall替换object的wait,notify,notifyall实现线(代码