通常,多线程之间需要协调工作。例如,浏览器的一个显示图片的线程displayThread想要执行显示图片的任务,必须等待下载线程downloadThread将该图片下载完毕。如果图片还没有下载完,displayThread可以暂停,当downloadThread完成了任务后,再通知displayThread“图片准备完毕,可以显示了”,这时,displayThread继续执行。
  
  以上逻辑简单的说就是:如果条件不满足,则等待。当条件满足时,等待该条件的线程将被唤醒。在Java中,这个机制的实现依赖于wait/notify。等待机制与锁机制是密切关联的。例如:
  
  synchronized(obj) {
  while(!condition) {
  obj.wait();
  }
  obj.doSomething();
  }
  
  当线程A获得了obj锁后,发现条件condition不满足,无法继续下一处理,于是线程A就wait()。
  
  在另一线程B中,如果B更改了某些条件,使得线程A的condition条件满足了,就可以唤醒线程A:
  
  synchronized(obj) {
  condition = true;
  obj.notify();
  }
  
  需要注意的概念是:
  
  # 调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) {...} 代码段内。
  
  # 调用obj.wait()后,线程A就释放了obj的锁,否则线程B无法获得obj锁,也就无法在synchronized(obj) {...} 代码段内唤醒A。
  
  # 当obj.wait()方法返回后,线程A需要再次获得obj锁,才能继续执行。
  
  # 如果A1,A2,A3都在obj.wait(),则B调用obj.notify()只能唤醒A1,A2,A3中的一个(具体哪一个由JVM决定)。
  
  # obj.notifyAll()则能全部唤醒A1,A2,A3,但是要继续执行obj.wait()的下一条语句,必须获得obj锁,因此,A1,A2,A3只有一个有机会获得锁继续执行,例如A1,其余的需要等待A1释放obj锁之后才能继续执行。
  
  # 当B调用obj.notify/notifyAll的时候,B正持有obj锁,因此,A1,A2,A3虽被唤醒,但是仍无法获得obj锁。直到B退出synchronized块,释放obj锁后,A1,A2,A3中的一个才有机会获得锁继续执行。

转载于:https://www.cnblogs.com/Fskjb/archive/2012/02/09/2343511.html

java多线程设计模式:wait/notify机制(转)相关推荐

  1. java多线程设计模式详解

    Java多线程设计模式 线程的创建和启动 Java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就 ...

  2. 图解Java多线程设计模式——Java多线程基础

    文章目录 简介 线程的启动 线程启动(1)--利用Thread类的子类 线程启动(2)--利用Runnable接口 利用ThreadFactory新启动线程 线程的暂停 线程的互斥处理 synchro ...

  3. java多线程设计模式详解[推荐]

    java多线程设计模式详解[推荐] java多线程设计模式详解之一 线程的创建和启动 java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run ...

  4. Java 多线程 不使用锁机制 实现交替打印数字和字母

    Java 多线程 不使用锁机制 实现交替打印数字和字母 这是一道经典的面试题,使用两个线程去交替打印数字和字母,输出1A2B3C4D5E6F7G-这样的效果,看了网上很多的文章,基本都是使用Condi ...

  5. Java多线程设计模式之顺序控制-两个小案例

    Java多线程设计模式之顺序控制-两个小案例 案例一 两个线程,保证B线程执行完毕后再让A线程执行 思路一:使用wait/notify,需要synchronized关键字支持 思路二:使用LockSu ...

  6. 图解Java多线程设计模式

    图解Java多线程设计模式 1-4章 第一部分 第五章 生产者与消费者 第六章 读写锁 7.8.9章 第三部分 第十章 Two-phase Termination 想要结束运行中的线程 ,这张有问题, ...

  7. 图解多线程设计模式pdf_图解Java多线程设计模式阅读计划-图灵社区.PDF

    图解Java多线程设计模式阅读计划-图灵社区 Java --1 Java Java 13 D API java.util.concurrent Java Java 3 321 20:00-22:00 ...

  8. Java多线程之线程同步机制(锁,线程池等等)

    Java多线程之线程同步机制 一.概念 1.并发 2.起因 3.缺点 二.三大不安全案例 1.样例一(模拟买票场景) 2.样例二(模拟取钱场景) 3.样例三(模拟集合) 三.同步方法及同步块 1.同步 ...

  9. java — 多线程设计模式

    前言: 本文章为作者原创,转载请注明出处,如该文章有技术问题,请指教,不胜感激.. 0528 一:多线程设计模式: 1.几种线程设计模式: 单例模式 不变模式 Future模式 生产者消费者模式 2. ...

  10. Java多线程设计模式(4)线程池模式

    前序: Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作.它将"委托消息的一端"和"执行消息的一端&qu ...

最新文章

  1. 邮箱数据库营销的概念及其特点介绍
  2. 雷军旗下金山云冲刺IPO:3年营收74亿,小米系贡献23%,CEO王育林仅持股2.1%
  3. python要不要装pycharm-python安装教程 Pycharm安装详细教程
  4. Hadoop 单机版和伪分布式版安装
  5. 独家 | 分答深度报告:42天估值1亿美金,分答如何获取百万付费用户?
  6. XgCalendar 代码导读和Demo详解(1)参数说明和数据结构
  7. Hadoop报错:All specified directories are failed to load.
  8. Kubernetes pod状态出现ImagePullBackOff的原因
  9. django-多级联动-前端效果
  10. C#学习常用方法(3000)---Foreach ,in
  11. crs-4124   Oracle 11gR2 RAC ohasd failed to start 解决方法
  12. Javascript实现的倒计时时钟
  13. python - 动态加载模块和类
  14. 孙忠的面向对象第二次作业
  15. 「数据新星」Databricks 崛起启示录
  16. X265代码学习1-X265源码下载编译及VS调试配置
  17. Qt文件路径:QDir
  18. blender快捷键
  19. 用等价类划分方法编写测试用例
  20. php errorcode,errorCode.php

热门文章

  1. 如何在iPhone / Android上进行Facebook联系人同步
  2. 如何在不确定经济形势下把握好企业脉搏
  3. MSP430学习小结2-程序主体结构安排及低功耗-转载
  4. 《精通ArcGIS Server 应用与开发》——2.4 ArcGIS Server的安装与配置
  5. Fiddler抓包7-post请求(json)
  6. MySQL · 性能优化 · SQL错误用法详解
  7. canvas-画图改进版
  8. PHP composer
  9. uva 10308 Roads in the North
  10. 打造最舒适的webview调试环境 1