多线程(51)忙等待

忙等待(Busy-waiting)是一种同步机制,其中一个进程或线程重复检查某个条件是否满足以便继续执行,而不是进入休眠或阻塞状态。这个条件通常与某种资源或锁的可用性有关。忙等待常常与自旋锁相关联,因为自旋锁就是通过忙等待来检查锁的状态。

为什么要避免忙等待?

  1. CPU资源浪费:忙等待会占用处理器资源进行无意义的循环检查,而不释放处理器去执行其他可能的任务。
  2. 效率低下:特别是在单处理器系统中,忙等待的线程会阻塞其他线程的执行,使得整体系统效率降低。
  3. 响应时间延迟:忙等待会导致线程响应其他任务的延迟,因为它们被固定在检查条件上。

忙等待示例

下面是一个忙等待的简单示例,我们模拟一个场景,某个线程需要等待一个信号(变量signal)被另一个线程设置为true

public class BusyWaitExample {private static volatile boolean signal = false;public static void main(String[] args) throws InterruptedException {Thread waitingThread = new Thread(() -> {// 忙等待直到 signal 变为 truewhile (!signal) {// 忙等待循环体通常为空或者执行非阻塞操作}System.out.println("Signal received. Waiting thread is proceeding.");});Thread signallingThread = new Thread(() -> {try {Thread.sleep(2000); // 模拟计算或其他操作} catch (InterruptedException e) {Thread.currentThread().interrupt();}signal = true; // 发送信号System.out.println("Signal sent.");});waitingThread.start();signallingThread.start();waitingThread.join();signallingThread.join();}
}

在这个例子中,waitingThread就是在进行忙等待。在signal变量被设置为true之前,它不停地检查signal的值而不做任何实际工作。

如何避免忙等待?

通常,我们可以通过使用某种阻塞机制(如等待/通知机制、信号量、互斥锁等)来避免忙等待。在Java中,可以使用wait()notify()notifyAll()方法,或者使用java.util.concurrent包中的工具类如LocksConditions

下面的代码展示了如何使用wait()notify()来避免忙等待:

public class WaitNotifyExample {private static final Object lock = new Object();private static boolean signal = false;public static void main(String[] args) throws InterruptedException {Thread waitingThread = new Thread(() -> {synchronized (lock) {while (!signal) {try {lock.wait(); // 阻塞而不是忙等待} catch (InterruptedException e) {Thread.currentThread().interrupt();}}System.out.println("Signal received. Waiting thread is proceeding.");}});Thread signallingThread = new Thread(() -> {synchronized (lock) {try {Thread.sleep(2000); // 模拟计算或其他操作} catch (InterruptedException e) {Thread.currentThread().interrupt();}signal = true; // 发送信号lock.notify(); // 通知等待的线程System.out.println("Signal sent.");}});waitingThread.start();signallingThread.start();waitingThread.join();signallingThread.join();}
}

在修改后的例子中,waitingThread将不再忙等待,而是在signal没有被设置之前阻塞在wait()方法上。这样就避免了忙等待,线程在等待信号的时候不会消耗CPU资源。

总之,忙等待虽然在某些低延迟和高性能的场景下适用,但在大多数情况下,它是应该被避免的。通过使用适当的同步工具和方法可以有效提高程序效率,节省系统资源。

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

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

相关文章

StarUML笔记之从UML图生成C++代码

StarUML笔记之从UML图生成C代码 —— 2024-04-14 文章目录 StarUML笔记之从UML图生成C代码1.Add Diagram2.在TOOLBOX中左键点击Class,松开,然后在中间画面再左键点击,即可出现UML3.修改类图,并添加接口,方法,属性,我…

webpack-(plugin,本地服务器,路径别名,安装vue)

安装vue npm i vue-loader -D npm i vue 编写一个vue文件: 在index.html中设置 一个id为app的div 将vue文件挂载到app中 vue比较特殊,除了使用loader外,还使用了plugin const path require("path"); const { VueLoaderPlugin …

数据库-Redis(11)

目录 51.什么是Redis事务? 52.Redis事务相关命令? 53.Redis事务的三个阶段?

将图片数据转换为张量(Go并发处理)

在Go语言中,将图片数据转换成Tensor通常需要依赖一些外部库,编写一个简单的程序,该程序批量同时处理图片,将其转换为对应的浮点数张量。 假设图片是单通道(灰度图)或者三通道(彩色图&#xff0…

论文笔记:SmartPlay : A Benchmark for LLMs as Intelligent Agents

iclr 2024 reviewer评分 5688 引入了 SmartPlay,一种从 6 种不同游戏中提取的基准 衡量LLM作为智能体的能力 1 智能代理所需的能力 论文借鉴游戏设计的概念,确定了智能LLM代理的九项关键能力,并为每项能力确定了多个等级: 长文…

Unity WebGL 2022 Release-Notes

🌈WebGL 2022 Release-Notes 版本更新内容2022.3.16WebGL: Fixed a bug that causes a parsing error due to misplaced regex.(UUM-21896)2022.3.15WebGL: Fixed a bug that caused for input to not be released when focus was removed from canvas on Windows C…

一个基于单片机内存管理-开源模块

概述 此模块是一位大佬写的应用于单片机内存管理模块mem_malloc,这个mem_malloc的使用不会产生内存碎片,可以高效利用单片机ram空间。 源码仓库:GitHub - chenqy2018/mem_malloc mem_malloc介绍 一般单片机的内存都比较小,而且没有MMU,malloc 与free的使用容易造成内存碎…

27、滑动窗口

滑动窗口 题目描述 给定一个大小为 n ≤ 1 0 6 n≤10^6 n≤106 的数组。 有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。 您只能在窗口中看到k个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子: 该数组为[1 3 -1 -3 5 3 6 7]…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.7 总账模块报表 -2.7.2 对外报表:现金流量表

2.7.2 对外报表:现金流量表 现金流量表包括直接法和间接法。使用SAP出具现金流量表,一般只能出具直接法报表。间接法是指按照净利润倒推出现金流量的发生额,由于其中存在人为“分析”的因素,很难直接通过科目的加加减减得出所需要…

神经网络模型底层原理与实现10-softmax的实现

import torch from IPython import display from d2l import torch as d2l batch_size256 #定义训练和验证数据集 train_iter,test_iterd2l.load_data_fashion_mnist(batch_size) #参数初始化,把输入图片看成长度784的向量,这个数据集有十个类别,输出为1…

小蚕爬树问题

小蚕爬树问题 问题描述: 编写一个函数 int day(int k,int m,int n),其功能是:返回小蚕需要多少天才能爬到树顶(树高 k 厘米,小蚕每天白天向上爬 m 厘米,每天晚上下滑 n 厘米,爬到树顶后不再下滑&#xff0…

(六)C++自制植物大战僵尸游戏关卡数据讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/xjvbb 游戏关卡数据文件定义了游戏中每一个关卡的数据,包括游戏类型、关卡通关奖励的金币数量、僵尸出现的波数、每一波出现僵尸数量、每一波僵尸出现的类型等。根据不同的游戏类型,定义了不同的通…

kafka ----修改log4j、jmx、jvm参数等

1、修改log4j 日志路径 在kafka-run-class.sh文件中修改如下配置,将 LOG_DIR变量指定为自己想要存储的路径 # Log directory to use if [ "x$LOG_DIR" "x" ]; thenLOG_DIR"$base_dir/logs" fi2、修改jmx参数 在kafka-run-class.s…

C++11 数据结构3 线性表的循环链式存储,实现,测试

上一节课,我们学了线性表 单向存储结构(也就是单链表),这个是企业常用的技术,且是后面各种的基本,一定要牢牢掌握,如果没有掌握,下面的课程会云里雾里。 一 ,循环链表 1…

stm32报错问题集锦

PS:本文负责记录本人日常遇到的报错问题,以及问题描述、原因以及解决办法等,解决办法百分百亲测有效。本篇会不定期更新,更新频率就看遇到的问题多不多了 更换工程芯片型号 问题描述 例程最开始用的芯片型号是STM32F103VE&#…

c++11 标准模板(STL)本地化库 - 平面类别(std::codecvt) - 在字符编码间转换,包括 UTF-8、UTF-16、UTF-32 (四)

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析,以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 在字符编码间转换,包括 UTF-8、UTF-16、UTF-32 std::…

C++设计模式探讨(1)-工厂模式

设计模式是架构设计之术,但不是道。是技巧和方法论,但不是核心思想。设计模式是世界规律的提取,但无法体现具体的形式。所以,设计模式是一个尴尬的存在,它有一定的价值,但却又十分有限。架构设计者需要做的…

IOS 短信拦截插件

在使⽤iOS设备的时候, 我们经常会收到1069、1065开头的垃圾短信, 如果开了iMessage会更严重, 各种乱七⼋糟的垃圾信息会时不时地收到。 从iOS11开始, ⼿机可以⽀持恶短信拦截插件了. 我们可以通过该插件添加⼀些规则通过滤这些不需要的信息. ⼀. 使⽤xcode新建⼀个项⽬ 【1】…

浦大喜奔APP8.0智能升级,发力数字金融深化五大金融篇章服务

1. 浦大喜奔立足科技赋能持续迭代升级,筑牢用户体验护城河 浦发信用卡中心坚持数字科技与客户体验双轮驱动,以科技赋能发展,优化整体系统性能,全方位支撑浦大喜奔 APP提高线上客户服务能力与体验,积极服务民生消费&a…

pyqt和opencv结合01:读取图像、显示

在这里插入图片描述 1 、opencv读取图像用于pyqt显示 # image cv2.imread(file_path)image cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 将图像转换为 Qt 可接受的格式height, width, channel image.shapebytes_per_line 3 * widthq_image QImage(image.data, width, hei…