方法

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相关推荐

  1. Synchronized结合Java Object对象中的 wait,notify,notifyAll

    前面我们在讲synchronized的时候,发现被阻塞的线程什么时候被唤醒,取决于获得锁的线程什么时候执行完同步代码块并且释放锁.那怎么做到显示控制呢?我们就需要借助一个信号机制: 在Object对象 ...

  2. java 多线程 notifyall_java多线程之 wait(),notify(),notifyAll()

    这几天在写一个java多线程服务器的功能,用到这些基础,自叹基础知识还需巩固,先写上一下这些说明,供自己和大家参考 wait(),notify(),notifyAll()不属于Thread类,而是属于 ...

  3. JAVA线程间协作:wait.notify.notifyAll

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  4. Java 多线程 4:wait() 和 notify()/notifyAll()

    轮询快速到底 线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作. 想像一个场景,A 线程做 int 型变量 i 的累加操作,B 线程等待 i 到了 1 ...

  5. Java多线程学习之wait、notify/notifyAll 详解

    点击"终码一生",关注,置顶公众号 每日技术干货,第一时间送达! 1.wait().notify/notifyAll() 方法是Object的本地final方法,无法被重写. 2. ...

  6. java 中的wait notify

    Wait&Notify 以下内容来自<Java并发编程的艺术>,4.3.2 等待/通知机制 线程A等待某一个变量_v_满足某个条件,而线程B会在某个不确定的时刻修改_v_,以使其满 ...

  7. java的object_Java中的Object类详细介绍

    理论上Object类是所有类的父类,即直接或间接的继承java.lang.Object类.由于所有的类都继承在Object类,因此省略了extends Object关键字. 该类中主要有以下方法: t ...

  8. java wait notifyall_Java多线程中的wait与notify,notifyall例子

    文章来给各位介绍一下Java多线程中的wait与notify,notifyall例子,希望文章能给各位朋友带来帮助哦. 在Java多线程编程中,wait()的作用的是让当前线程进入阻塞状态,notif ...

  9. [转]java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?

    在 Java中,所有对象都能够被作为"监视器monitor"--指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity. 所有对象的非同步 方法都能够在任意时刻被任意线 ...

最新文章

  1. 国家微生物科学数据中心推出免费一站式生物信息分析云平台
  2. mysql数据库批量编码_MySQL批量修改数据库的编码类型
  3. 请教于国富律师——怎样把灰鸽子病毒和灰鸽子程序区分开
  4. 【MongoDB】NoSQL Manager for MongoDB 教程(基础篇)
  5. power计算机英语,十万火急求解计算机英语!AC power lineAND gateAND-OR circuitXOR gateunrel...
  6. 发那科冲压直线搬运机器人_行业应用 | 直线七轴软件配置
  7. SAP Cloud for Customer UI Designer里如何消费Object Value Selector(OVS)
  8. Spark入门(十二)之最值
  9. 2015春浙江省二级c语言,2015-2015年浙江省高校计算机等级考试二级C试题.doc
  10. Linux 后台开发运维人员常用的Linux命令汇总
  11. H.264官方软件JM源代码简单分析-解码器ldecod
  12. 9款很棒的网页绘制图表JavaScript框架脚本
  13. Jmeter测试——java测试脚本编写
  14. html5设置视频显示第一帧,【前端】如何在video上显示视频的第一帧
  15. Solr面试回答思路
  16. 20155318 《Java程序设计》实验四 (Android程序设计)实验报告
  17. R语言之基本统计分析
  18. 红帽Rhel7.6操作系统更换成Centos7.6的操作系统
  19. 3GS到iPhone6P+ 历代iPhone屏幕尺寸、像素分辨率
  20. 汽车各部位名称及故障处理

热门文章

  1. kafka之消息格式
  2. 为什么旗舰智能手机屏幕越来越大
  3. 百万人在线的直播间实时聊天消息分发技术
  4. DAG vs. MPP
  5. 富集分析,看完这篇就够
  6. [微软/Azure]IoT平台解决方案
  7. 管理经济学之颗粒归仓(一)
  8. linux cpu控制软件下载,Linux CPU频率控制
  9. 简单探究神经网络中权重、偏置维度的关系
  10. 又有一家fintech初创公司估值直冲千亿美金!