java多线程设计模式:wait/notify机制(转)
以上逻辑简单的说就是:如果条件不满足,则等待。当条件满足时,等待该条件的线程将被唤醒。在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机制(转)相关推荐
- java多线程设计模式详解
Java多线程设计模式 线程的创建和启动 Java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就 ...
- 图解Java多线程设计模式——Java多线程基础
文章目录 简介 线程的启动 线程启动(1)--利用Thread类的子类 线程启动(2)--利用Runnable接口 利用ThreadFactory新启动线程 线程的暂停 线程的互斥处理 synchro ...
- java多线程设计模式详解[推荐]
java多线程设计模式详解[推荐] java多线程设计模式详解之一 线程的创建和启动 java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run ...
- Java 多线程 不使用锁机制 实现交替打印数字和字母
Java 多线程 不使用锁机制 实现交替打印数字和字母 这是一道经典的面试题,使用两个线程去交替打印数字和字母,输出1A2B3C4D5E6F7G-这样的效果,看了网上很多的文章,基本都是使用Condi ...
- Java多线程设计模式之顺序控制-两个小案例
Java多线程设计模式之顺序控制-两个小案例 案例一 两个线程,保证B线程执行完毕后再让A线程执行 思路一:使用wait/notify,需要synchronized关键字支持 思路二:使用LockSu ...
- 图解Java多线程设计模式
图解Java多线程设计模式 1-4章 第一部分 第五章 生产者与消费者 第六章 读写锁 7.8.9章 第三部分 第十章 Two-phase Termination 想要结束运行中的线程 ,这张有问题, ...
- 图解多线程设计模式pdf_图解Java多线程设计模式阅读计划-图灵社区.PDF
图解Java多线程设计模式阅读计划-图灵社区 Java --1 Java Java 13 D API java.util.concurrent Java Java 3 321 20:00-22:00 ...
- Java多线程之线程同步机制(锁,线程池等等)
Java多线程之线程同步机制 一.概念 1.并发 2.起因 3.缺点 二.三大不安全案例 1.样例一(模拟买票场景) 2.样例二(模拟取钱场景) 3.样例三(模拟集合) 三.同步方法及同步块 1.同步 ...
- java — 多线程设计模式
前言: 本文章为作者原创,转载请注明出处,如该文章有技术问题,请指教,不胜感激.. 0528 一:多线程设计模式: 1.几种线程设计模式: 单例模式 不变模式 Future模式 生产者消费者模式 2. ...
- Java多线程设计模式(4)线程池模式
前序: Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作.它将"委托消息的一端"和"执行消息的一端&qu ...
最新文章
- 邮箱数据库营销的概念及其特点介绍
- 雷军旗下金山云冲刺IPO:3年营收74亿,小米系贡献23%,CEO王育林仅持股2.1%
- python要不要装pycharm-python安装教程 Pycharm安装详细教程
- Hadoop 单机版和伪分布式版安装
- 独家 | 分答深度报告:42天估值1亿美金,分答如何获取百万付费用户?
- XgCalendar 代码导读和Demo详解(1)参数说明和数据结构
- Hadoop报错:All specified directories are failed to load.
- Kubernetes pod状态出现ImagePullBackOff的原因
- django-多级联动-前端效果
- C#学习常用方法(3000)---Foreach ,in
- crs-4124 Oracle 11gR2 RAC ohasd failed to start 解决方法
- Javascript实现的倒计时时钟
- python - 动态加载模块和类
- 孙忠的面向对象第二次作业
- 「数据新星」Databricks 崛起启示录
- X265代码学习1-X265源码下载编译及VS调试配置
- Qt文件路径:QDir
- blender快捷键
- 用等价类划分方法编写测试用例
- php errorcode,errorCode.php