文章目录

  • wait()
    • wait()原理
      • monitor
  • notify()
  • notifyAll()
    • sleep()与wait()区别
  • 使用案例

wait()、notify()、notifyAll()都是Object的方法;

https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E5%B9%B6%E5%8F%91.md#wait-notify-notifyall

wait()

调用 wait() 使得线程等待某个条件满足,线程在等待时会被挂起,当其他线程的运行使得这个条件满足时,其它线程会调用 notify() 或者 notifyAll() 来唤醒挂起的线程。

  1. 在调用wait()之前,线程必须要获得该对象的对象级别锁,因此只能在同步方法或同步块中调用wait()方法,否则会在运行时抛出 IllegalMonitorStateException。

  2. 使用 wait()方法 挂起期间,当前线程会释放锁。
    这是因为,如果没有释放锁,那么其它线程就无法进入对象的同步方法或者同步控制块中,那么就无法执行 notify() 或者 notifyAll() 来唤醒挂起的线程,就会造成死锁

注意

  • 调用 wait()后,线程被挂起后,如果没有notify() 或者 notifyAll() 来唤醒挂起的线程,就会造成死锁
  • notify()或notifyAll()方法调用后,等待线程依旧不会从wait()返回,需要调用notify()或 notifAll()的线程释放锁之后,等待线程才有机会从wait()返回。

wait()原理

monitor

monitor在JVM中是基于C++的实现的,ObjectMonitor中有几个关键属性:

_owner:指向持有ObjectMonitor对象的线程
_WaitSet:存放处于wait状态的线程队列
_EntryList:存放处于等待锁block状态的线程队列
_recursions:锁的重入次数
_count:用来记录该线程获取锁的次数

    当多个线程同时访问一段同步代码时,首先会进入_EntryList队列中,当某个线程获取到对象的monitor后进入_Owner区域并把monitor中的_owner变量设置为当前线程,同时monitor中的计数器_count加1。即获得锁。
    若持有monitor的线程调用wait()方法,将释放当前持有的monitor,_owner变量恢复为null,_count自减1,同时该线程进入_WaitSet集合中等待唤醒。
    若当前线程执行完毕也将释放monitor(锁)并复位变量的值,以便其他线程进入获取monitor(锁)

notify 方法: 从等待队列中唤醒任意一个线程,使该线程退出等待队列,进入可运行状态,也就是notify()方法仅通知一个线程。
notifyAll 方法: 使所有正在等待队列中线程退出等待队列,进入就绪状态。
wait 方法: 阻塞

由此可知wait()原理:

The Owner中的线程,调用wait()后进入Wait Set,调用被notify()或者notifyAll()可以唤醒Wait Set中的一个或者所有线程。

调用wait()的前提是线程获取到了锁,并处于运行态(所以wait()方法必须用在同步方法或者同步代码块中),当调用wait()后,线程由运行态转变为阻塞态,需要被notify() 或者 notifyAll()唤醒


notify()

从等待队列中唤醒任意一个线程,使该线程退出等待队列,进入可运行状态,也就是notify()方法仅通知一个线程。


notifyAll()

使所有正在等待队列中线程退出等待队列,进入就绪状态。

sleep()与wait()区别

  1. sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;
  2. sleep() 方法是线程类(Thread)的静态方法;wait()是Object对象的方法;
  3. sleep()会占着锁不放;wait()会释放锁;

使用案例

public class WaitNotifyExample {public synchronized void before() {System.out.println("before");notifyAll();}public synchronized void after() {try {wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("after");}
}

wait()、notify()、notifyAll()原理用法详解sleep()与wait()区别相关推荐

  1. defaultdict用法详解

    defaultdict用法详解 defaultdict与dict区别 defaultdict使用方法 defaultdict与dict区别 在dict中取key的值,若key不在dict中,报错,如下 ...

  2. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  3. python的编程模式-Python设计模式之状态模式原理与用法详解

    本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...

  4. python字符串strip的作用_Python字符串函数strip()原理及用法详解

    Python字符串函数strip()原理及用法详解 strip:用于移除字符串头尾指定的字符(默认为空格)或字符序列.注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符. 语法:str.s ...

  5. java的wait_java wait()方法用法详解

    一.wait(), notify(), notifyAll()等方法介绍 1.wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁."直到其他线程调用 ...

  6. java wait用法详解

    一.wait(), notify(), notifyAll()等方法介绍 1.wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁."直到其他线程调用 ...

  7. java list用法_java list的用法详解

    java list的用法详解 java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中.以下是百分网小编搜索整理的关于java list的用法详解,需要的朋友可以参考一下!想了解更多相关 ...

  8. java list用法_Java List 用法详解及实例分析

    Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...

  9. STL中map和string, vector 用法详解

    1. map 用法详解 std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成 ...

  10. Java语言Socket接口用法详解

    Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Serve ...

最新文章

  1. 科大星云诗社动态20210906
  2. Python bytes 函数 - Python零基础入门教程
  3. Swift的函数嵌套和返回内部函数
  4. 第四卷 风起海外 第三百九十四章 修士、妖兽、小岛
  5. visual studio写python_将 Visual Studio 变身为 Python IDE
  6. html图片轮播幻灯片,JS+css3实现幻灯片轮播图
  7. 形式化验证(Formal verification)如何确保完美的智能合同?
  8. [MapReduce] Counter
  9. Mathtype安装教程(mathpage.wll文件未找到)
  10. 想要顺利携号转网?让你少跑弯路的小贴士!
  11. storj for windows 主网挖矿指南
  12. 这些实用的手机小技巧分享给你
  13. 重采样 上采样 下采样
  14. FPGA实现信号n倍插值(内插0)
  15. hdu6608 Fansblog(威尔逊定理)
  16. 【深度学习】经典神经网络 VGG 论文解读
  17. [Unity] Catan Universe: Unity 的移动设备优化
  18. win10 Edge关闭smartscreen筛选器
  19. python数据科学常国珍_《PYTHON数据科学:全栈技术详解》常国珍//赵仁乾//张秋剑著【摘要 书评 在线阅读】-苏宁易购图书...
  20. 【STM8L】STM8L之timer2定时中断

热门文章

  1. linux查询语言,Linux结构化查询语言SQL——SQL的分类和DDL使用
  2. java cron 解析_quartz cron 在线解析
  3. C/C++[PAT B level 1004,1012]
  4. 自动驾驶 9-5: EKF 的局限性 Limitations of the EKF
  5. 极客大学架构师训练营 编程的本质与未来 第三课 听课总结
  6. 反地理编码 高德地图_由中文地址返回点位坐标-地理编码脚本分享
  7. C++的类型转换操作符
  8. 2020 恒生电子 面经
  9. tomcat source code in eclipse
  10. 彻底解决git中.gitignore文件失效原因及解决办法