java wait notifyall_Java中的wait/notify/notifyAll
方法
java.lang.Object
public final native void wait() throws InterruptedException;
public final native void wait(long millis, int nanos) throws InterruptedException;
public final void wait(long millis) throws InterruptedException {
wait(millis, 0);
}
public final native void notify();
public final native void notifyAll();
wait():使调用该方法的线程释放锁,从运行状态退出,进入等待队列,直到被唤醒。
wait(long timeout):等待一段时间是否有线程唤醒锁,如果没有,超时自动唤醒。
wait(long timeout, int nanos):等待唤醒时间纳秒级别。
notify():随机唤醒等待队列中的等待同一个锁的一个线程,使这个线程退出等待队列,进入可运行状态。
notifyAll():唤醒所有等待同样锁的所有线程,从等待队列中退出,进入可运行状态。
注意点
在调用wait或者notify之前,必须获得该对象的对象锁,即,只能在同步方法中调用;
执行完wait之后释放对象锁,所以其他线程可以获得执行机会,才能唤醒;
执行notify之后,不会立即退出让wait的线程执行,必须要先把同步块中的程序执行完,退出同步块,才会释放锁,让等待线程执行;
notify每次通知一个线程,多次调用通知线程数增加,可将wait线程全部唤醒。
原理
每个对象都有个monitor,初始是0,执行完synchronized值就是1。
wait/notify需要在获得monitor的线程中才可以执行。
所以,wait/notify需要在synchronized中执行。
其中,wait又会释放掉锁,破坏掉同步。
跟synchronized关系
synchronized代码块生成的字节码,被monitorenter和monitorexit包围,持有对象的monitor;
线程执行wait/notify方法时,必须持有对象的monitor;
所以,wait/notify方法在synchronized同步块中执行,就持有了对象的锁。
互斥和协同
Java语言的同步机制在底层实现上只有两种方式:互斥和协同。
互斥:即synchronized内置锁。
协同:即内置条件队列,wait/notify/notifyAll。
条件队列中是处于等待状态的线程,等待特定条件为真。每个Java对象都可以作为一个锁,同样每个Java对象都可以作为一个条件队列。通过wait/notify/notifyAll来操作条件队列。
可以理解为:有一个队列,o.wait()就push进去,o.notify()就pull出来。
要调用条件队列的任何一个方法,都必须要获得对象上的锁。
线程是用来工作的,不应该处于等待状态,处于等待状态的条件队列中的线程,一定是执行不下去的。
在while中等待
while(condition is not true) {
lock.wait()
}
解释:两个消费者线程c1和c2,逻辑都是,判断资源是否为空,是就wait,否就消费一个;某个时刻,两个线程都进入等待队列,然后生产者生产了一个资源,并执行notifyAll,唤醒c1和c2都进入锁池,c1先获取锁,执行完消费掉资源,然后释放锁,此时,如果c2获得锁,如果是if逻辑,那么就会进入消费代码,但是资源已经被c1消费掉了,可能抛出异常。如果是while逻辑,则不会进入消费代码,而是继续等待。
在一般情况下,总应该调用notifyAll唤醒所有需要被唤醒的线程。可能会唤醒其他一些线程,但这不影响程序的正确性,这些线程醒来之后,会检查他们正在等待的条件(循环检测),如果发现条件不满足,就会继续等待
显示锁和显示条件队列
显示锁:Lock,对应内置锁synchronized
显示条件队列:Condition,对应内置条件队列,对应方法是await, signal, signalAll
问题
notifyAll唤醒所有线程,但不是所有线程都能执行,必须要等待对象锁被释放,获取锁之后才能执行。可以说,notifyAll让线程进入锁池。
java wait notifyall_Java中的wait/notify/notifyAll相关推荐
- Synchronized结合Java Object对象中的 wait,notify,notifyAll
前面我们在讲synchronized的时候,发现被阻塞的线程什么时候被唤醒,取决于获得锁的线程什么时候执行完同步代码块并且释放锁.那怎么做到显示控制呢?我们就需要借助一个信号机制: 在Object对象 ...
- java 多线程 notifyall_java多线程之 wait(),notify(),notifyAll()
这几天在写一个java多线程服务器的功能,用到这些基础,自叹基础知识还需巩固,先写上一下这些说明,供自己和大家参考 wait(),notify(),notifyAll()不属于Thread类,而是属于 ...
- JAVA线程间协作:wait.notify.notifyAll
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- Java 多线程 4:wait() 和 notify()/notifyAll()
轮询快速到底 线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作. 想像一个场景,A 线程做 int 型变量 i 的累加操作,B 线程等待 i 到了 1 ...
- Java多线程学习之wait、notify/notifyAll 详解
点击"终码一生",关注,置顶公众号 每日技术干货,第一时间送达! 1.wait().notify/notifyAll() 方法是Object的本地final方法,无法被重写. 2. ...
- java 中的wait notify
Wait&Notify 以下内容来自<Java并发编程的艺术>,4.3.2 等待/通知机制 线程A等待某一个变量_v_满足某个条件,而线程B会在某个不确定的时刻修改_v_,以使其满 ...
- java的object_Java中的Object类详细介绍
理论上Object类是所有类的父类,即直接或间接的继承java.lang.Object类.由于所有的类都继承在Object类,因此省略了extends Object关键字. 该类中主要有以下方法: t ...
- java wait notifyall_Java多线程中的wait与notify,notifyall例子
文章来给各位介绍一下Java多线程中的wait与notify,notifyall例子,希望文章能给各位朋友带来帮助哦. 在Java多线程编程中,wait()的作用的是让当前线程进入阻塞状态,notif ...
- [转]java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
在 Java中,所有对象都能够被作为"监视器monitor"--指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity. 所有对象的非同步 方法都能够在任意时刻被任意线 ...
最新文章
- 国家微生物科学数据中心推出免费一站式生物信息分析云平台
- mysql数据库批量编码_MySQL批量修改数据库的编码类型
- 请教于国富律师——怎样把灰鸽子病毒和灰鸽子程序区分开
- 【MongoDB】NoSQL Manager for MongoDB 教程(基础篇)
- power计算机英语,十万火急求解计算机英语!AC power lineAND gateAND-OR circuitXOR gateunrel...
- 发那科冲压直线搬运机器人_行业应用 | 直线七轴软件配置
- SAP Cloud for Customer UI Designer里如何消费Object Value Selector(OVS)
- Spark入门(十二)之最值
- 2015春浙江省二级c语言,2015-2015年浙江省高校计算机等级考试二级C试题.doc
- Linux 后台开发运维人员常用的Linux命令汇总
- H.264官方软件JM源代码简单分析-解码器ldecod
- 9款很棒的网页绘制图表JavaScript框架脚本
- Jmeter测试——java测试脚本编写
- html5设置视频显示第一帧,【前端】如何在video上显示视频的第一帧
- Solr面试回答思路
- 20155318 《Java程序设计》实验四 (Android程序设计)实验报告
- R语言之基本统计分析
- 红帽Rhel7.6操作系统更换成Centos7.6的操作系统
- 3GS到iPhone6P+ 历代iPhone屏幕尺寸、像素分辨率
- 汽车各部位名称及故障处理