消息通信的两种模型:
  • 消息传递
wait/notify是采用该种机制实现的。 是借助于操作系统底层的消息通信机制。
  • 共享内存
多线程中的数据同步的内存可见性是基于些模型。例如,A线程修改了变量值,
该变量的值会先写回主内存,然后再由B线程从主内存读取过来。
概念
wait: 当前线程释放锁的使用权,进入阻塞阶段
notify: 随机唤醒一个阻塞的线程,让它从新获取锁的使用权
notifyall: 唤醒对象头中wait队列的所有线程,所有线程竟争上岗抢占锁控制权
用途&场景
操作共享资源时,一线程阻塞挂起,真到另一线程通知唤醒才继续执行。
适用于生产者-消费者模型。
原理
Q:wait和notify为什么一定要放在synchronized里面?
A: 从2个层面理解:
第1个层面: 现实中的例子说起, 你坐公交车让位置, 你首先得获取到位置(资源)才行,而获取到位置的途径只能是通过抢占(synchronized), 所以说,wait和notify需要在synchronized块之中;
第2个层面: 实现原理, 线程是基于对象的,在对象头里面会有一个wait队列、owner和计数器, 如果要释放锁和唤醒线程,首先需要获取到对象,只有获取到对象才能操作对象头里面的monitor,而获取对象的唯一方法就是synchronized。
代码例子
以下例子如果take线程不执行notify,那么put线程将一直停留在那儿。
final Account account = new Account();
Thread put = new Thread(new Runnable(){
public void run(){
synchronized(account){
try {
System.out.println("put will wait");
account.wait();
System.out.println("put over");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Thread take = new Thread(new Runnable(){
public void run(){
synchronized(account){
System.out.println("take will notify");
try {
Thread.sleep(3000L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("take notify over");
//account.notify();
}
}
});

理解高并发(9).线程通信之_wait、notify相关推荐

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

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

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

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

  3. 如何理解高并发中的协程?协程的实现和历史

    <Libco是一个C/C++协程库,在微信服务中广泛使用> <协程到底是什么?> <如何理解高并发中的协程?协程的实现和历史> 目录 普通的函数 从普通函数到协程 ...

  4. 《深入理解高并发编程》学习笔记

    文章目录 幕后黑手 可见性 原子性 有序性 解决办法 java内存模型 volatile Happens-Before原则 程序次序规则 volatile变量规则 传递规则 锁定规则 线程启动规则 线 ...

  5. 《深入理解高并发编程:JDK核心技术》-冰河新书上市

    大家好,我是冰河~~ 废话说多了没用,并发编程技术一直是初级程序员进阶高级工程师的前提条件,也是成为大厂程序员的必备技能,更是突破自身技术瓶颈的必经之路. 2022年6月我出版了"冰河技术丛 ...

  6. 从根上理解高性能、高并发(五):深入操作系统,理解高并发中的协程

    本文原题"程序员应如何理解高并发中的协程",转载请联系作者. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早就了然与胸,什么线程池 ...

  7. Java高并发入门-线程初步

    Java高并发入门-线程初步 线程与进程之间的关系 进程就是我们运行在计算机上的一个程序,对应Java程序来说就是运行在计算机上的Java应用程序,这个程序在运行的时候就会创建了一个进程,服务器上就会 ...

  8. 冰河最新出版的《深入理解高并发编程:核心原理与案例实战》到底讲了些啥?(视频为证)

    大家好,我是冰河~~ 最近有很多小伙伴问我:<深入理解高并发编程:核心原理与案例实战>这本书有没有目录.我:安排!这不,我连夜录制了这本书的整体内容,希望能够为小伙伴们带来实质性的帮助,直 ...

  9. 线程基础,多线程架构,高并发,线程安全基础知识

    线程基础,多线程架构,高并发,线程安全基础知识 线程基础 一.线程安全 1.1概念:当多个线程访问某一个类(对象或者方法)时,这个类始终都能表现出正确额行为,那么这个类(对象或者方法)就是线程安全的. ...

最新文章

  1. 我的Dll(动态链接库)学习笔记
  2. Ubuntu安装nodeJS
  3. 网站性能调优开发工具: Lighthouse, Puppeteer 以及进阶部分丨 Google 开发者大会 2018...
  4. Android内存分析工具:Memory Profiler
  5. ESP32-CAM使用过程中可能会遇到的问题
  6. Eclipse 一直Building Workspace 的解决办法
  7. RGB to HSB or RGB to HSL
  8. Spring+SpringMVC+MyBatis+easyUI整合基础篇(四)代码简化
  9. android:碎片的概念
  10. linux df命令无反馈,Linux-df命令
  11. 有三角形的即时通讯源码?
  12. 关于日期控件被模态框遮盖的问题解析
  13. ThinkPHP5.0版本和ThinkPHP3.2版本的差别
  14. 小程序方法-小程序获取上一页的数据修改上一个页面的数据
  15. 计算机五大类型,操作系统目前有五大类型
  16. qomo linux最新版本,Qomo Linux下一个版本将推驱动中心
  17. 【田间连着车间、佘太酒业这十年!
  18. 捷顺对讲服务器地址在哪修改,捷顺软件安装说明.docx
  19. Python网络爬虫之数据解析(一)
  20. 合肥工业大学计算机信息检索报告,合肥工业大学计算机信息检索(图书馆资源利用)作业.doc...

热门文章

  1. 智能水杯设计方案_中山智能水杯设计,平衡车设计方案
  2. PHP获取客户端真实IP地址的方法
  3. 走遍美国MP4 第 01 - 78集迅雷下载地址:
  4. OpenStack安装Glance组件
  5. 怎么在IDEA的一个窗口中打开多个项目
  6. 多路复用技术主要有几种类型?它们各有什么特点
  7. wwwwwwwwo杂记
  8. 悬浮地板哪种可以?如何区分及安装悬浮地板?
  9. TuRBO(2019NIPS)—贝叶斯优化的应用
  10. 前端对接stripe支付,创建测试session_is