wait/notify/notifyAll方法需不需要被包含在synchronized块中
Object.wait(),
Object.notify(),
Object.notifyAll()
都是Object的方法,换句话说,就是每个类里面都有这些方法。
Object.wait():释放当前对象锁,并进入阻塞队列
Object.notify():唤醒当前对象阻塞队列里的任一线程(并不保证唤醒哪一个)
Object.notifyAll():唤醒当前对象阻塞队列里的所有线程
为什么这三个方法要与synchronized一起使用呢?解释这个问题之前,我们先要了解几个知识点
每一个对象都有一个与之对应的监视器
每一个监视器里面都有一个该对象的锁和一个等待队列和一个同步队列
wait()方法的语义有两个,一是释放当前对象锁,另一个是进入阻塞队列,可以看到,这些操作都是与监视器相关的,当然要指定一个监视器才能完成这个操作了
notify()方法也是一样的,用来唤醒一个线程,你要去唤醒,首先你得知道他在哪儿,所以必须先找到该对象,也就是获取该对象的锁,当获取到该对象的锁之后,才能去该对象的对应的等待队列去唤醒一个线程。值得注意的是,只有当执行唤醒工作的线程离开同步块,即释放锁之后,被唤醒线程才能去竞争锁。
notifyAll()方法和notify()一样,只不过是唤醒等待队列中的所有线程
因wait()而导致阻塞的线程是放在阻塞队列中的,因竞争失败导致的阻塞是放在同步队列中的,notify()/notifyAll()实质上是把阻塞队列中的线程放到同步队列中去
值得提的一点是,synchronized是一个非公平的锁,如果竞争激烈的话,可能导致某些线程一直得不到执行。
个人简介
我是一名开发工程师,目前35K,目前做的是无人驾驶,欢迎和大家一起交流开发技术,一起高薪就业,我们还有一起打妖怪的群哦,还有面试题小程序哦!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持“java全栈开发”