其他分享
首页 > 其他分享> > 为什么wait,notify和notifyAll要与synchronized一起使用?为什么要放在Object类里面

为什么wait,notify和notifyAll要与synchronized一起使用?为什么要放在Object类里面

作者:互联网

目录

 

为什么wait,notify和notifyAll要与synchronized一起使用?

wait()和notify()是Object的成员函数,是基础中的基础。为什么Java要把wait()和notify()放在如此基础的类里面,而不是作为像Thread一类的成员函数,或者其他类的成员函数呢?


为什么wait,notify和notifyAll要与synchronized一起使用?

Object.wait(),Object.notify(),Object.notifyAll()都是Object的方法,换句话说,就是每个类里面都有这些方法。

为什么这三个方法要与synchronized一起使用呢?解释这个问题之前,我们先要了解几个知识点

wait()方法的语义有两个,一是释放当前对象锁,另一个是进入阻塞队列,可以看到,这些操作都是与监视器相关的,当然要指定一个监视器才能完成这个操作了

notify()方法也是一样的,用来唤醒一个线程,你要去唤醒,首先你得知道他在哪儿,所以必须先找到该对象,也就是获取该对象的锁,当获取到该对象的锁之后,才能去该对象的对应的等待队列去唤醒一个线程。值得注意的是,只有当执行唤醒工作的线程离开同步块,即释放锁之后,被唤醒线程才能去竞争锁。

notifyAll()方法和notify()一样,只不过是唤醒等待队列中的所有线程

因wait()而导致阻塞的线程是放在阻塞队列中的,因竞争失败导致的阻塞是放在同步队列中的,notify()/notifyAll()实质上是把阻塞队列中的线程放到同步队列中去

为了便于理解,你可以把线程想象成一个个列车,对象想象成车站,每一个车站每一次能跑一班车,这样理解起来就比较容易了。值得提
的一点是,synchronized是一个非公平的锁,如果竞争激烈的话,可能导致某些线程一直得不到执行。
 

wait()和notify()是Object的成员函数,是基础中的基础。为什么Java要把wait()和notify()放在如此基础的类里面,而不是作为像Thread一类的成员函数,或者其他类的成员函数呢?

两个线程之间要通信,对于同一个对象来说,一个线程调用该对象的wait(),另一个线程调用该对象的notify(),该对象本身就需要同步!所以,在调用wait()、notify()之前,要先通过

synchronized关键字同步给对象,也就是给该对象加锁。
synchronized关键字可以加在任何对象的实例方法上面,任何对象都可能成为锁。因此,wait()和notify()只能放在Object里面了。

 

 

 

 

 

 

 

 

 

 

标签:synchronized,队列,notifyAll,Object,对象,线程,notify,wait
来源: https://blog.csdn.net/LWYYYYYY/article/details/116155143