wait()、notify()和notifyAll()是 Object类 中的方法
来源:互联网 发布:生鲜网络销售平台 编辑:程序博客网 时间:2024/05/21 11:03
从这三个方法的文字描述可以知道以下几点信息:
1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。
2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁)
3)调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程;
4)调用notifyAll()方法能够唤醒所有正在等待这个对象的monitor的线程;
有朋友可能会有疑问:为何这三个不是Thread类声明中的方法,而是Object类中声明的方法(当然由于Thread类继承了Object类,所以Thread也可以调用者三个方法)?其实这个问题很简单,由于每个对象都拥有monitor(即锁),所以让当前线程等待某个对象的锁,当然应该通过这个对象来操作了。而不是用当前线程来操作,因为当前线程可能会等待多个线程的锁,如果通过线程来操作,就非常复杂了。
上面已经提到,如果调用某个对象的wait()方法,当前线程必须拥有这个对象的monitor(即锁),因此调用wait()方法必须在同步块或者同步方法中进行(synchronized块或者synchronized方法)。
调用某个对象的wait()方法,相当于让当前线程交出此对象的monitor,然后进入等待状态,等待后续再次获得此对象的锁(Thread类中的sleep方法使当前线程暂停执行一段时间,从而让其他线程有机会继续执行,但它并不释放对象锁);
notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的monitor的话,则只能唤醒其中一个线程,具体唤醒哪个线程则不得而知。
同样地,调用某个对象的notify()方法,当前线程也必须拥有这个对象的monitor,因此调用notify()方法必须在同步块或者同步方法中进行(synchronized块或者synchronized方法)。
nofityAll()方法能够唤醒所有正在等待该对象的monitor的线程,这一点与notify()方法是不同的。
- Condition是个接口,基本的方法就是await()和signal()方法;
- Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
- 调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用
Conditon中的await()对应Object的wait();
Condition中的signal()对应Object的notify();
Condition中的signalAll()对应Object的notifyAll()
- wait()、notify()和notifyAll()是 Object类 中的方法
- wait()、notify()和notifyAll()是 Object类 中的方法
- wait()、notify()和notifyAll()Object类 的方法
- wait()和notify(),notifyAll()是Object类的方法,sleep()和yield()是Thread类的方法
- Object中的wait,notify,notifyAll基本使用
- Object的wait、notify、notifyall方法解析
- Object类中的wait()方法和notify()方法
- java并发中的wait(),notify(),notifyAll()方法和Condition接口
- java Object中的wait和notify方法
- java Object 类中 notify() ,notifyAll() ,wait()
- Object类wait,notify,notifyAll的使用
- Java中的wait、notify、notifyall方法
- Java中的synchronized、Object.wait()、Object.notify()/notifyAll()原理
- Java中的synchronized、Object.wait()、Object.notify()/notifyAll()原理
- Java中的synchronized、Object.wait()、Object.notify()/notifyAll()原理
- Java中的synchronized、Object.wait()、Object.notify()/notifyAll()的使用
- Java中的synchronized、Object.wait()、Object.notify()/notifyAll()原理
- Java 中的 wait(), notify ()和 notifyAll ()
- bzoj 3289: Mato的文件管理(毒瘤毒瘤毒瘤题啊)
- POJ2411——Mondriaan's Dream(轮廓线dp入门)
- 机器学习(周志华) 参考答案 第五章 神经网络
- poj3617_简单贪心
- windows下设置由多个项目组成的解决方法的编译环境
- wait()、notify()和notifyAll()是 Object类 中的方法
- Android之数据存储
- Java基础之构造函数和重载
- 安卓luncher,实现自动启动,按home键回到luncher页面功能
- windows下spark环境搭建
- mysql查看binlog日志内容
- svn服务端从安装到运行
- NYOJ 36 最长公共子序列
- HDU 1562 Guess the number