并发编程理论基础——解决死锁【等待-通知机制优化循环等待】(五)

破坏占用且等待条件时,如果使用while死循环

  1. 在并发量不大的情况下循环几十上百次也就好了
  2. 如果while中执行方法时间比较长,或者并发量大时,可能要循环上万次才能获取到锁,非常消耗CPU

相较于使用while死循环,更好的方案是:等待-通知机制

  1. 线程首先获取互斥锁
  2. 当线程要求的条件不满足时,释放互斥锁,进入等待状态
  3. 当要求满足时,通知等待的线程,重新获取互斥锁
  4. 优势:使用线程阻塞的方式可以有效避免循环等待消耗过多CPU 的情况

用synchronized可以实现等待-通知机制

下图中,左侧有一个等待队列,同一时刻只允许一个线程进入synchronized保护的临界区,当有一个线程进入临界区后,其他线程就只能进入左侧等待队列中(这个等待队列和互斥锁是一对一的关系,每个互斥锁都有自己独立的等待队列)

  1. 在并发程序中,当一个线程进入临界区,由于某些条件不满足,需要进入等待队列,此时wait()满足需求
  2. Wait()执行后,当前线程会被阻塞,并且进入右侧的等待队列(右侧的等待队列就是互斥锁的等待队列),进入等待队列的同时,会释放所有的互斥锁,线程释放锁之后,其他线程就有机会获得锁,并进入临界区
  3. 之后当满足条件时使用notify()/notifyAll()来通知互斥锁的等待队列中的线程,告诉他曾经条件满足过;只有通知时间的此时此刻条件是满足的,而被通知线程的执行时间点和通知的时间点基本上不会重合,所以当线程执行的时候,很可能条件已经不满足了(保不齐有其他线程插队)
  4. 被通知的线程要想重新执行,仍然需要获取到互斥锁(因为曾经获取的锁在调用 wait() 时已经释放了)

Notify()和notifyAll()的区别

  1. 尽量使用notifyAll(),使用notify() 很有风险,它的风险在于可能导致某些线程永远不会被通知到。
  2. notify() 是会随机地通知等待队列中的一个线程,而 notifyAll() 会通知等待队列中的所有线程。
  3. notify() 何时可以使用
    • 所有等待线程拥有相同的等待条件;
    • 所有等待线程被唤醒后,执行相同的操作;
    • 只需要唤醒一个线程。
  4. 案例
    • 假设我们有资源 A、B、C、D,线程 1 申请到了 AB,线程 2 申请到了 CD,此时线程 3 申请 AB,会进入等待队列(AB 分配给线程 1,线程 3 要求的条件不满足),线程 4 申请 CD 也会进入等待队列。我们再假设之后线程 1 归还了资源 AB,如果使用 notify() 来通知等待队列中的线程,有可能被通知的是线程 4,但线程 4 申请的是 CD,所以此时线程 4 还是会继续等待,而真正该唤醒的线程 3 就再也没有机会被唤醒了。

wait() 方法和 sleep() 方法都能让当前线程挂起一段时间,那它们的区别是什么?

  1. wait释放资源,sleep不释放资源
  2. wait需要被唤醒,sleep不需要
  3. wait需要获取到监视器,否则抛异常,sleep不需要
  4. wait是object顶级父类的方法,sleep则是Thread的方法
  5. 两者相同点:都会让渡CPU执行时间,等待再次调度!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/720589.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

位图法-有效的数独

有效的数独,主要是判断每行每列每宫有无重复元素。 每行每列用二重循环,每宫比较复杂,需要考虑每一宫的坐标与二重循环ij对应关系 行i,每一宫3行,3列 x3*(i/3)j/3 y3*(i%3)j%3

超简洁的待办事项自托管便签todo

什么是todo todo 是一个自托管的 todo web 应用程序,可让您以简单且最少的方式跟踪您的 todo。 搭建 使用Docker命令行方式进行搭建 docker run -d -p 8000:8000 -v todo_db:/usr/local/go/src/todo/todo.db prologic/todo Docker-compose.yml version: 3 ​ se…

全球首个开源类Sora模型大升级,16秒720p画质电影感爆棚!代码和权重全面开源!

目录 01 视频界开源战士 02 深度解码技术 03 打破闭环,开源赋能 潞晨Open-Sora团队刚刚在720p高清文生视频质量和生成时长上实现了突破性进展! 全新升级的Open-Sora不仅支持无缝生成任意风格的高质量短片,更令人惊喜的是,团队选…

BC153 [NOIP2010]数字统计

数字统计 一.题目描述二.输入描述:三.输出描述:四.数字范围五.题目思路六.代码实现 一.题目描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。 比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次…

VM4.3 二次开发04 方案输出结果设置

方案输出结果设置,这个设置是为了在二次开发的上位机软件中显示我们想要的数据,和在二开中如何获取这些结果。 打开方案点下如中的图标。 打开如下图。 再点点红色圈出来的图标,打开参数设置界面。 输出设置可以要输出的数据和参数名称。点上…

基于YOLOv10深度学习的高密度人脸智能检测与统计系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

Java23种设计模式(二)

1、单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有…

Linux系统之mtr命令的基本使用

Linux系统之mtr命令的基本使用 一、mtr命令介绍二、mtr命令使用帮助2.1 mtr命令的帮助信息2.2 mtr帮助信息解释 三、安装mtr工具四、mtr命令的基本使用4.1 直接使用4.2 设定ping次数4.3 禁用DNS解析4.4 显示IP地址4.5 调整间隔 五、总结 一、mtr命令介绍 mtr命令是一个网络诊断…

Hype4.0 for Mac软件下载-Hype for Mac HTML5 创作工具下载附加详细安装步骤

Hype 4 Pro Mac正式版是款功能实用的动画创作工具。Hype 4 Pro Mac最新版可以帮您轻松创建令人惊叹的动画和交互式网页内容。并且Hype 4 Pro Mac还可被设计师用来创建动画,为网页、信息图形、演示文稿、数字杂志、广告、iBooks、教育内容、应用程序原型、作品集、动…

46. 【Java教程】Optional 类

上一小节,我们接触到了Optional类,但没有详细展开介绍,Optional类也是 Java 8 新加入的类。本小节我们就来学习一下这个类,你将了解到Optional类的解决了什么问题,如何创建Optioanl类的对象,它又有哪些常用…

【MySQL进阶之路 | 高级篇】SQL执行过程

1. 客户端与服务器的连接 运行中的服务器程序与客户端程序本质上都是计算机的一个进程,所以客户端进程向服务器端进程发送请求并得到相应过程的本质就是一个进程间通信的过程. 我们可以使用TCP/IP网络通信协议,命名管道和共享内存等方式,实…

2024/6/18 英语每日一段

While refusing to attribute various problems to specific labs in order to protect the investigators’ sources, the Gladstone AI team told The Washington Times that it found various assessments of security issues were “totally untethered to reality” about…

【STM32】GPIO简介

1.GPIO简介 GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。 STM32芯片的GPIO被分成很多组,每组有16个引脚。 最基本的输出…

RockChip Android12 System之Datetime

一:概述 本文将针对Android12 Settings二级菜单System中Date&time的UI修改进行说明。 二:Date&Time 1、Activity packages/apps/Settings/AndroidManifest.xml <activityandroid:name="Settings$DateTimeSettingsActivity"android:label="@stri…

ubuntu 18.04 安装vnc

如何在Ubuntu 18.04安装VNC | myfreax sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils sudo apt install tigervnc-standalone-server tigervnc-common vncserver sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils sudo apt ins…

胡说八道(24.6.17)——STM32以及通信杂谈

之前的文章中咱们谈到了STM32的时钟&#xff0c;今天我们来联系实际&#xff0c;来看看内部时钟下和外部时钟下的两种不同时钟的电平翻转。本次终于有硬件了&#xff0c;是最基础的STM32F103C8T6。 首先是&#xff0c;内部时钟的配置操作。 系统的内部时钟是72MHz&#xff0c;由…

2021年9月电子学会青少年软件编程 中小学生Python编程等级考试三级真题解析(选择题)

2021年9月Python编程等级考试三级真题解析 选择题(共25题,每题2分,共50分) 1、使用map函数可以实现列表数据元素类型的转换,而无需通过循环。则将列表L=[1,3,5,7,9]转换为列表[1,3,5,7,9]的函数写法为 A、map(int,L) B、list(map(int,L)) C、map(L,int) D、list(map…

归并排序与计数排序

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 1.归并排序 1.递归实现归并排序 归并排序 //归并排序public static void mergeSort(int[] array) {mergeSortFun(array,0,array.length-1); r…

重生奇迹MU召唤术师简介

出生地&#xff1a;幻术园 性 别&#xff1a;女 擅 长&#xff1a;召唤幻兽、辅助魔法&攻击魔法 转 职&#xff1a;召唤巫师&#xff08;3转&#xff09; 介 绍&#xff1a;从古代开始流传下来的高贵的血缘&#xff0c;为了种族纯正血缘的延续及特殊使用咒术的天赋&…

2024.6.18

Python的网络编程 网络四层 在开始前,我们需要先了解一下我们在网络通信过程中的四个层次 我们上网产生的数据都是经过协议栈一层一层的封装然后经网卡发送到网络&#xff0c;经网络发送到服务端&#xff0c;然后服务端又是一层一层的解封装拿到自己想要的数据。 我们学习的…