wait和notify底层原理

  • Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态
  • BLOCKED 和 WAITING 的线程都处于阻塞状态,不占用 CPU 时间片
  • BLOCKED 线程会在 Owner 线程释放锁时唤醒
  • WAITING 线程会在 Owner 线程调用 notify 或 notifyAll 时唤醒,但唤醒后并不意味者立刻获得锁,仍需进入EntryList 重新竞争

wait和notify的使用

wait和notify需要和synchronized一起使用,即需要先获得锁

public class Test {final static Object obj = new Object();public static void main(String[] args) {new Thread(() -> {synchronized (obj) {log.debug("执行....");try {obj.wait(); // 让线程在obj上一直等待下去} catch (InterruptedException e) {e.printStackTrace();}log.debug("其它代码....");}}).start();new Thread(() -> {synchronized (obj) {log.debug("执行....");try {obj.wait(); // 让线程在obj上一直等待下去} catch (InterruptedException e) {e.printStackTrace();}log.debug("其它代码....");}}).start();// 主线程两秒后执行sleep(2);log.debug("唤醒 obj 上其它线程");synchronized (obj) {obj.notify(); // 唤醒obj上一个线程// obj.notifyAll(); // 唤醒obj上所有等待线程}}
}
  • notify()会随机唤醒一个线程;
  • notifyAll()会唤醒所有线程;
  • wait()会释放锁,进入WaitSet等待区,知道收到notify()的通知;
  • wait(Long n)有时间的等大四,超过时间就不再等待;

wait(long n) 和 sleep(long n)区别

  • sleep 是 Thread 方法,而 wait 是 Object 的方法
  • sleep 不需要强制和 synchronized 配合使用,但 wait 需要和 synchronized 一起用
  • sleep 在睡眠的同时,不会释放对象锁的,但 wait 在等待的时候会释放对象锁
  • 它们状态都是 TIMED_WAITING

总结

synchronized(lock) {while(条件不成立) {lock.wait();}// 干活
}
//另一个线程
synchronized(lock) {lock.notifyAll();
}

线程间的通信之wait和notify的使用相关推荐

  1. 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析

    文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...

  2. 高并发编程-线程通信_使用wait和notify进行线程间的通信

    文章目录 概述 场景 引子 synchronized wait/notify机制 synchronized wait/notify 改造 问题 概述 Java中线程通信协作的最常见的两种方式: syn ...

  3. Java 多线程(七) 线程间的通信

    Java 多线程(七) 线程间的通信--wait及notify方法 线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法 ...

  4. 高并发编程-使用wait和notifyAll进行线程间的通信3_多线程下的生产者消费者模型和notifyAll

    文章目录 概述 解决办法 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析 中分析了假死的原因,这里我们来看下改如何解决在多线程下出现的这 ...

  5. educoder 使用线程锁(lock)实现线程同步_线程间的通信(一)

    这篇文章主要从4个角度来讲多线程间的通信: 使用wait/notify实现线程间的通信 生产者/消费者模式的实现 方法join的使用 ThreadLocal类的使用 等待/通知机制的实现: (1)wa ...

  6. Java中condition的用法_java5 Condition用法--实现线程间的通信

    Condition的功能类似在传统线程技术中的Object.wait()和Object.natify()的功能,传统线程技术实现的互斥只能一个线程单独干,不能说这个线程干完了通知另一个线程来干,Con ...

  7. java多线程:线程间的通信-生产者和消费者(三)

    在一个程序中,往往会通过多个线程协同来共同完成一项任务,线程间必然需要进行信息的传递,也即是进程间的通信,我们用生产者和消费者的例子来具体分析: 对于生产者和消费者之间的关系,他们都是针对同一资源的操 ...

  8. 多线程复习笔记之二【线程间的通信】

    Object.wait:释放锁,当时代码不会往下继续执行,需要等待notify通知,wait(1000)超过1秒自动唤醒 Object.notify:不释放锁,需要等到同步代码块执行完毕,如果没有wa ...

  9. 看了这篇文章,就别担心线程间的通信了!

    线程间的通信 1.为什么需要线程通信 线程是操作系统调度的最小单位,有自己的栈空间,可以按照既定的代码逐步的执行,但是如果每个线程间都孤立的运行,那就会造资源浪费.所以在现实中,我们需要这些线程间可以 ...

  10. 线程间实现通信的几种方式

    目录 线程通信相关概述 提出问题 方式一:使用Object类的wait() 和 notify() 方法 方式二:Lock 接口中的 newContition() 方法返回 Condition 对象,C ...

最新文章

  1. pyqt5学习(四)事件和信号
  2. 关于计算机三个人的英语对话,关于三个人的英语对话
  3. Blue-Red Permutation 贪心,思维
  4. lrange是取出所有值并移除么_美欧日站点亚马逊物流库存绩效指标分数达标值将降低为 450...
  5. 关于aop:pointcut的expression配制说明及JoinPoint
  6. vs2010创建和使用动态链接库(dll)
  7. python创建树_python – 从SQLalchemy中的自引用表创建树
  8. 【推荐系统】那些年, 引用量超1000的经典推荐系统论文
  9. Atitit 字符串模板与 字符串插值 目录 1.1. 字符串插值是将字符串中的占位符替换为局域变量的过程 1 1.2. 模板字面量 是允许嵌入表达式的字符串字面量 1 1.3. 格式化字符串[编辑
  10. Ubuntu之hadoop非分布式(单机)和伪分布式安装
  11. 在linux下用C语言编写贪吃蛇小游戏
  12. 全国道路运输管理人员考试多选练习题库
  13. 微信小程序使用有道翻译接口的方法
  14. android 股票行情走势图K线控件 KLineView
  15. 完全端到端语音合成JETS: Jointly Training FastSpeech2 and HiFi-GAN for End to End Text toSpeech 简单解读
  16. [STM32] 发现一篇非常好的讲解libusb、winusb、libusbk关系的文章
  17. linux下mysql可视化工具安装
  18. 一个清华大学生几天猎头生活的感想---很有感触的一篇文章(zz)
  19. [转载]zz傅里叶变换,拉普拉斯变换和Z变换的意义
  20. 拓展延伸: 实现一个百亿级别的计算器

热门文章

  1. html 显示编辑xml文件,如何将 XML 文件显示为 HTML 表格展示
  2. java.util.list包_Java的Util包总结
  3. iis6扩展php_教你IIS6的PHP最佳配置方法
  4. AWS DeepRacer 参数调优 Amazon SageMaker 和 Amazon RoboMaker
  5. Operation和OperationQueue详解
  6. 斯坦福大学自然语言处理第五课“拼写纠错(Spelling Correction)”
  7. 自编码模型autoencoder
  8. 【Codeforces Round #533(Div. 2)】D.Kilani and the Game【多源bfs】
  9. 解决vscode中Linter pylint is not installed的问题
  10. c语言怎么设计程序框图,C语言课程设计————写下流程图! 谢谢