一个线程调用了object.wait() ,那么会进入object的等待队列。
这个队列可能有很多线程同时等待某个对象。
当notify被调用的时候,它会从这个队列中随机选一个线程,唤醒它,这个完全是随机的。
notifyAll()是唤醒所有等待的。
wait,notify,notifyall方法使用的条件,必须再synchronzied语句中,因为需要获得目标对象的一个监视器。
为什么这三个方法要与synchronized一起使用呢?解释这个问题之前,我们先要了解几个知识点
每一个对象都有一个与之对应的监视器
每一个监视器里面都有一个该对象的锁和一个等待队列和一个同步队列
wait()方法的语义有两个,一是释放当前对象锁,另一个是进入阻塞队列,可以看到,这些操作都是与监视器相关的,当然要指定一个监视器才能完成这个操作了
notify()方法也是一样的,用来唤醒一个线程,你要去唤醒,首先你得知道他在哪儿,所以必须先找到该对象,也就是获取该对象的锁,当获取到该对象的锁之后,才能去该对象的对应的等待队列去唤醒一个线程。值得注意的是,只有当执行唤醒工作的线程离开同步块,即释放锁之后,被唤醒线程才能去竞争锁。
notifyAll()方法和notify()一样,只不过是唤醒等待队列中的所有线程
因wait()而导致阻塞的线程是放在阻塞队列中的,因竞争失败导致的阻塞是放在同步队列中的,notify()/notifyAll()实质上是把阻塞队列中的线程放到同步队列中去
为了便于理解,你可以把线程想象成一个个列车,对象想象成车站,每一个车站每一次能跑一班车,这样理解起来就比较容易了。
suspend,resume被废弃,请勿使用
参考文章:
https://blog.csdn.net/qq_39907763/article/details/79301813?utm_source=blogxgwz9