干货-并发编程提高——线程的唤醒(七)

news2024/11/16 5:31:02

  1. 没有参数的wait()方法等价于wait(0),等价于永远等下去。
  2. 虚假唤醒:一个线程也能在没有被通知,中断,或超时的情况下被唤醒。也即所谓的“虚假唤醒”。
  3. 解决虚假唤醒的办法就是通过while循环来判断条件。
  4. 何为虚假唤醒

  5. 简单讲,要避免使用 if 的方式来判断条件,否则一旦线程恢复,就继续往下执行,不会再次检测条件。由于可能存在的“虚假唤醒”,并不意味着条件是满足的,这点甚至对简单的“二人转”的两个线程的 wait/notify 情况也需要注意。
  6. 另外,如果对于更多线程的情况,比如“生产者和消费者”问题,一个生产者,两个消费者,更加不能简单用 if 判断。因为可能用的是 notifyAll,两个消费者同时起来,其中一个先抢到了锁,进行了消费,等另一个也抢到锁时,可能条件又不满足了,所以还是要继续判断,不能简单认为被唤醒了就是条件满足了。不过,这是一个不确定的等待,可能等待(无法获取锁时),也可能不等待(能获取锁)。陷入这种阻塞后也没有自主退出的机制。
  7. BLOCKED 和 WAITING 状态的区别和联系
  8. 在说完了 BLOCKED,WAITING 和 TIMED_WAITING 后,我们可以综合来看看它们,比如,阻塞与等待到底有什么本质的区别呢?
  9. 显然,BLOCKED 同样可以视作是一种特殊的,隐式的 wait/nofity 机制。等待的条件就是“有锁还是没锁”。
  10. 有一点需要注意的是,BLOCKED 状态是与 Java 语言级别的 synchronized 机制相关的,我们知道在 Java 5.0 之后引入了更多的机制(java.util.concurrent),除了可以用 synchronized 这种内部锁,也可以使用外部的显式锁。
  11. 显式锁有一些更好的特性,如能中断,能设置获取锁的超时,能够有多个条件等,尽管从表面上说,当显式锁无法获取时,我们还是会说,线程被“阻塞”了,但却未必是 BLOCKED 状态。
  12. 当锁可用时,其中的一个线程会被系统隐式通知,并被赋予锁,从而获得在同步块中的执行权。
  13. 显然,等待锁的线程与系统同步机制形成了一个协作关系。
  14. 对比来看, WAITING 状态属于主动地显式地申请的阻塞,BLOCKED 则属于被动的阻塞,但无论从字面意义还是从根本上来看,并无本质的区别。
  15. 在前面我们也已经说过,这三个状态可以认为是传统 waiting 状态在 JVM 层面的一个细分。
  16. 主流java虚拟机的实现中,java线程是映射到操作系统的元素内核线程之上的。Java线程->LWP(轻量级进程)->KLT(内核级线程),如果要阻塞或唤醒一条线程。则需要操作系统来帮忙完成。这样就不可避免的会陷入用用户态到核心态的转换之中。状态转换是很耗费处理器时间的。虚拟机本身也会进行一些优化,诸如在进入阻塞前,加入一段自旋等待过程。以避免频繁切换。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

磷酸铁锂与三元锂:谁会取得压倒性的胜利?

在电动车市场中,磷酸铁锂(LFP)和三元锂(NCM/NCA)电池是两种主要的锂离子电池技术。近年来,关于这两种电池的讨论愈发热烈。本文将深入探讨磷酸铁锂与三元锂的真正区别,以及它们在未来电动车市场…

AI8-文本检测

文本检测任务是找出图像或视频中的文字位置。不同于目标检测任务,目标检测不仅要解决定位问题,还要 解决目标分类问题。 文本在图像中的表现形式可以视为一种‘目标‘,通用的目标检测的方法也适用于文本检测,从任务本身上来 看: • 目标检测:给定图像或者视频,找出目…

什么是SQL注入?基于实例讲解

一、SQL注入的含义: SQL注入是一种常见的网络攻击,由于程序对输入数据的判断或者检验不严格,导致攻击者查询到了授权范围之外的数据,甚至还可以修改数据库中的数据,对数据库执行一些管理操作等,所以它的危…

【Material-UI】Button 中的点击事件处理(Handling clicks)详解

文章目录 一、点击事件处理基础1. 基本用法2. 事件处理器的传递 二、实际应用中的注意事项1. 事件处理逻辑的优化2. 避免过多的状态更新3. 使用合适的事件类型 三、关于文档中未提及的原生属性四、最佳实践1. 无障碍性2. 视觉反馈3. 防止重复点击 五、总结 在现代前端开发中&am…

测试TLP 使用外部 50Ω 电缆和非 50Ω 电缆影响

测试目的 实验有 SMA 母头连接器与没有SMA母头连接器 I/V 曲线的影响实验 50Ω 电缆和非 50Ω 电缆应用条件下的 I/V 曲线研究初始启动和 16A DUT(被测器件)应用条件下的脉冲电压和脉冲电流影响 开始测试前先做短路/开路校正 短路校正 开路校正 TLP取样方式与为框黄色70ns~90…

详解线程池的使用

一、线程池基础 1.1、线程池的思想 我们首先理解什么是池化技术: 池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。 池化技术的优点主要有两个:提前准备和重复利用。 下面是池化技术常见的应用场景: …

SpringBoot+Redis 发布与订阅

两个应用都引入 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artif…

机器学习入门之无监督学习(聚类、降维(主成分分析)、关联度分析(Apriori 算法))

无监督学习是机器学习的一种类型&#xff0c;它处理没有显式标签的数据。与监督学习不同&#xff0c;无监督学习的目标是探索数据的内在结构和模式&#xff0c;而不是从标注数据中学习一个特定的映射到预定标签的函数。这使得无监督学习特别适用于探索性数据分析、找寻隐藏模式…

关于加载水印PDF、图片以及压缩包格式文件【把博客当工作记录】

写这篇文章的目的是让大家都可以学到东西,核心代码中列出了处理思维和调用方法,业务代码已经过滤掉了,希望大家不要做crud程序员!!要思考。。。该博客不懂时可联系下方。 1、流程图如下 2、策略描述 实现方式: 设计模式:父策略调动子策略 业务理念:在不影响原有业务…

【电脑基础硬件】从零开始认识主板

从零开始认识主板 一、主板及其元器件二、主板上的各个部件通信三、主板的选择 注意&#xff1a; 以下以Z790电脑主板为例进行说明。 一、主板及其元器件 IO接口&#xff1a; CPU模块 CPU是电脑的大脑&#xff0c;控制并指挥着电脑的各个模块协同工作。CPU通过主板上的插槽固定…

电路中电阻,电容和电感作用总结

电阻作用 1&#xff0c;上拉电阻 电阻的连接一般是一端接上拉的电源&#xff08;一般与芯片信号的电压值相匹配&#xff09;&#xff0c;另一端连接芯片引脚所对应的信号大概如下图 功能&#xff1a;一、预置某些引脚的功能&#xff0c;例如复位信号拉高&#xff08;失能&…

疯传!平台培养“斗士”的背后,是 AI 智能名片与 O2O 商城小程序在搞鬼

摘要&#xff1a;本文探讨了在搭建用户聚集平台以筛选和培养“斗士”的过程中&#xff0c;如何融入 AI 智能名片和 O2O 商城小程序。详细阐述了贴吧或论坛作为初始平台的优势&#xff0c;以及如何通过适当的管理和引导活动筛选出“储备斗士”。同时&#xff0c;分析了 AI 智能名…

浅谈 Mybatis 框架

文章目录 一、什么是MyBatis?1.2、JDBC 二、使用Mybatis2.1、配置MyBatis开发环境2.1.1、配置连接字符串2.1.2、配置MyBatis中的XML路径 2.2、使用MyBatis模式和语法操作数据库 三、使用 Mybatis 进行增删改查操作的要点3.1、ResultMap的用法 四、Mybatis操作难点4.1、#{ } 和…

Modbus-TCP详解

目录 Modbus-TCP Modbus TCP协议的帧结构如下&#xff1a; 实现Modbus-Tcp 使用EasyModbusTCP第三方实现Modbus-Tcp EasyModbusTCP的使用 设置IP 设置端口 设置设备地址 开启通讯 读取寄存器 写入寄存器 实例 Modbus-TCP Modbus TCP是Modbus协议的一种变体&#xff0c;它使用T…

Java多线程的单例设计模式 多种实现方法

目录 前言 饿汉式 懒汉式 Double_check volatile double_check Holder方式 枚举 前言 单例设计模式GOF23中设计模式中最常用的设计模式之一, 单例设计模式提供了多线程环境下的保证唯一实例性的解决方案, 虽然简单, 但是实现单例模式的方式多种多样, 因此需要从多个维度去…

【云原生】恰当运用kubernetes中三种探针,确保应用程序在Kubernetes集群中保持健康、可用和可靠

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Unity热更——ILRuntime安装接入

一、ILRuntime相关地址 1、官网文档地址 2、GitHub上开源的ILRuntime项目工程 3、GitHub上的官方ILRuntime-Unity实例工程 4、官方视频教程-Unity中文课堂&#xff08;需付费&#xff09; 5、ILRuntime入门笔记-赵青青-博客园 6、ILRuntime 的学习-简书 二、ILRuntime…

Python | Leetcode Python题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; def quickSelect(a: List[int], k: int) -> int:seed(datetime.datetime.now())shuffle(a)l, r 0, len(a) - 1while l < r:pivot a[l]i, j l, r 1while True:i 1while i < r and a[i] < pivot:i 1j - 1while j > l an…

自动生成数据:Navicat 16 让数据测试更高效

文章目录 前言一、Navicat是什么&#xff1f;二、Navicat 16 新功能1. 自动生成数据2. 改进的用户界面3. 云同步 三、 安装指南Windows 版安装macOS 版安装Linux 版安装 四、使用示例&#xff1a;自动生成数据1. 创建连接2. 选择表3. 打开数据生成器4. 设置数据规则5. 生成数据…

top命令实时监测Linux进程

top命令可以动态实时显示Linux进程信息&#xff0c;方便观察频繁换进换出的内存的进程变化。 top命令执行示例如下&#xff1a; 其中&#xff0c;第一行表示系统当前时间、系统的运行时间、登录的用户数目、系统的平均负载&#xff08;最近1分钟&#xff0c;最近5分钟&#xff…