阻塞锁和自旋锁的理解

阻塞锁和自旋锁的理解

文章目录

    • 阻塞锁和自旋锁的理解
      • 阻塞锁
      • 自旋锁
      • 阻塞锁
      • 自旋锁
      • 各自的优缺点
        • 自旋锁
        • 阻塞锁
      • 选择自旋锁还是阻塞锁

想象你和你的朋友们一起玩一个游戏,但是每次只能一个人玩。为了决定谁先玩,你们可以用两种方法来排队:

阻塞锁

阻塞锁就像是在排队时坐下来等。假设你们有一个椅子,只有轮到你时你才可以站起来玩。如果轮到你的朋友玩,你就坐在椅子上休息,等轮到你时再站起来。这种方式的好处是你可以省力,不用一直站着等。

自旋锁

自旋锁就像是在排队时站着不停地走动。假设你们站成一排等待,每个人都一直走来走去,随时准备轮到自己。这种方式的好处是当轮到你时,你可以马上开始玩,因为你已经准备好了。不过缺点是你会一直走来走去,可能会有点累。

在计算机里面,当不同的程序需要访问同一个资源(比如一段数据)时,它们需要排队,避免同时使用导致错误。阻塞锁和自旋锁就是用来解决这个问题的两种方法:

  • 阻塞锁:程序会停下来等待,直到资源可用。这就像坐下来休息,等轮到自己。
  • 自旋锁:程序会不停地检查资源是否可用,这就像一直走来走去,随时准备使用资源。

总结一下,阻塞锁更省力,但是等待时间可能会稍长;自旋锁更快,但是会占用更多的计算资源。不同的情况下,程序会选择不同的锁来使用。

阻塞锁

阻塞锁是指当线程尝试获取锁失败时,线程进入阻塞状态,直到接收信号后被唤醒.(线程的状态包括新建、就绪、运行、阻塞及死亡)在JAVA中,能够唤醒阻塞线程的操作包括Object.notify, Object.notifyAll, Condition.signal, LockSupport.unpark。

阻塞锁在获取锁失败后,会进行阻塞,这时涉及到cpu的上下文切换。再唤醒时,也需要重新去获取cpu时间片,也需要上下文切换。

自旋锁

线程在一个循环中尝试获取锁,直到获取到锁为止。此时该线程会一直占用cpu,直到获取到锁才释放。但是由于一直在尝试获取锁中,所以执行速度会比阻塞锁快。

各自的优缺点

自旋锁

优点:

  1. 低延迟:自旋锁的等待时间通常很短,因为它只是简单地检查锁是否可用,没有涉及操作系统的调度开销。
  2. 简单实现:自旋锁的实现通常比较简单,不需要涉及复杂的操作系统机制。
  3. 适用于短时间等待:在锁定时间非常短的情况下,自旋锁可以非常高效,因为它避免了线程上下文切换的开销。

缺点:

  1. 高CPU使用率:自旋锁会不断地检查锁的状态,占用大量的CPU资源,可能导致CPU浪费。
  2. 不适合长时间等待:如果锁被占用的时间较长,自旋锁会导致大量的资源浪费,因此不适合长时间等待的场景。
  3. 可能导致优先级反转:在某些情况下,自旋锁可能会导致低优先级线程占用CPU时间,从而延迟高优先级线程的执行。
阻塞锁

优点:

  1. 节省CPU资源:阻塞锁在等待时会将线程挂起,让出CPU资源,其他任务可以继续执行。
  2. 适用于长时间等待:如果锁被占用的时间较长,阻塞锁更合适,因为线程会被挂起,直到锁可用。
  3. 减少资源竞争:通过挂起线程,阻塞锁减少了资源竞争和系统开销。

缺点:

  1. 高延迟:由于涉及操作系统的调度和线程上下文切换,阻塞锁的等待时间可能较长。
  2. 复杂实现:阻塞锁的实现需要依赖操作系统的调度机制,通常比自旋锁更复杂。
  3. 可能导致上下文切换开销:如果线程频繁地被挂起和唤醒,可能导致大量的上下文切换开销。

选择自旋锁还是阻塞锁

  1. 短时间锁定:如果预计锁定时间非常短,自旋锁可能更高效,因为避免了线程挂起和唤醒的开销。
  2. 长时间锁定:如果预计锁定时间较长,阻塞锁更合适,因为可以节省CPU资源。

总体来说,自旋锁适用于锁定时间短、锁竞争不频繁的场景,而阻塞锁更适合锁定时间较长或锁竞争较频繁的场景。根据具体的应用需求选择合适的锁类型,可以优化系统性能。

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

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

相关文章

小程序-生命周期(2) 应用周期/页面周期

一.应用周期 应用周期指的是小程序:启动->运行->销毁的整个过程。 应用周期伴随一些函数来进行控制,这些函数卸载app.js里面的App方法里。 分别由onLaunch, onShow,onHide依次进行。 onLaunch:初始化的时候运行…

第3讲:关于Pixi的Text、Container、Sprite、Graphics组件功能作用

首先这里提供一个公用代码: 下部分各种组件基于这个公用代码直接往下添加代码即可。 import {Application, Text, Container, Sprite, BaseTexture, Texture, Graphics} from pixi.js import ./style.css import testImageUrl from ./images/test.jpg // 指明Appli…

3.1、前端异步编程(超详细手写实现Promise;实现all、race、allSettled、any;async/await的使用)

前端异步编程规范 Promise介绍手写Promise(resolve,reject)手写Promise(then)Promise相关 API实现allraceallSettledany async/await和Promise的关系async/await的使用 Promise介绍 Promise是一个类,可以翻…

HTML静态网页成品作业(HTML+CSS)—— 家乡成都介绍网页(4个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有4个页面。 二、作品演示 三、代…

【玩转google云】实战:如何在GKE上使用Helm安装和配置3节点的RabbitMQ集群

需求 因项目需要需要在Google Kubernetes Engine (GKE) 中使用Helm安装一个3节点的RabbitMQ集群,配置用户名和密码,开通公网访问的Web管理界面,指定namespace为mq,并使用5G的硬盘存储MQ的数据。 前提条件 GKE集群:确保你有一个运行中的GKE集群。Helm工具:确保已安装Hel…

Qt 插件框架

在Qt框架中实现插件系统主要涉及到使用Qt的插件机制来动态加载和卸载插件模块。 1、定义插件接口 首先,你需要定义一个或多个接口类,这些类将作为插件和主程序之间的契约。这些接口类通常包含纯虚函数,插件需要实现这些函数。 // MyPlug…

C语言 | Leetcode C语言题解之第164题最大间距

题目&#xff1a; 题解&#xff1a; int maximumGap(int* nums, int numsSize) {if (numsSize < 2) {return 0;}int maxVal INT_MIN, minVal INT_MAX;for (int i 0; i < numsSize; i) {maxVal fmax(maxVal, nums[i]);minVal fmin(minVal, nums[i]);}int d fmax(1,…

计算机网络:3数据链路层

数据链路层 概述封装成帧和透明传输帧透明传输&#xff08;填充字节或比特&#xff09;差错检测奇偶校验循环冗余校验CRC Cyclic Redundancy Check 可靠传输停止-等待协议回退n帧协议&#xff08;滑动窗口协议&#xff09;选择重传协议 点对点协议PPP共享式以太网网络适配器&am…

ubuntu版本升级命令记录

小版本升级(如22.04.3到22.04.4) 具体的版本控制并不常用于小版本升级&#xff0c;因为这些版本升级通常涵盖了安全补丁和错误修复。确保 /etc/apt/sources.list 中的软件源是正确的&#xff0c;并定期运行升级命令&#xff0c;系统将自动升级到最新的小版本。 # 检查当前版本…

java本地缓存(map,Guava,echcache,caffeine)优缺点,以及适用场景

前言 在高并发系统环境下&#xff0c;jvm本地缓存扮演着至关重要的角色&#xff0c;合理的应用能够使系统响应迅速&#xff0c;提高用户体验感&#xff0c;而分布式缓存redis则存在着网络io&#xff0c;以及流量消耗问题&#xff0c;需要和本地缓存搭配使用&#xff0c;才能使…

机器学习算法 —— K近邻(KNN分类)

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 目录 KNN的介绍和应用KNN的介绍1) KNN建立过程2) 类别的判定KNN的优点KNN的缺点KNN的应用实战KNN分类数据集 —— KNN分类库函数导入数据导入模型训练&可视化原理简析莺尾花数据集 —— KNN分…

微信小程序-API 本地存储

一.本地存储-同步API 存储 &#xff1a; wx.setStorageSync 获取&#xff1a;wx.getStorageSync 删除&#xff1a;wx.removeStorageSync 清空&#xff1a;wx.clearStorageSync 代码&#xff1a; save(){//存储wx.setStorageSync(id, 1) wx.setStorageSync(obj, {name:"te…

React+TS前台项目实战(十一)-- 全局常用组件提示语可复制Link组件封装

文章目录 前言HighLightLink组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇讲的这个组件&#xff0c;是一个用于高亮显示文本并添加可选的跳转链接&#xff0c;提示文本&#xff0c;复制文本的 React 组件 HighLightLink组件 1. 功能分析 &#x…

【交易策略】#22-24 残差资金流强度因子

【交易策略】#22-24 残差资金流强度因子

路由控制和策略路由

文章目录 一、路由控制&#xff08;1&#xff09;、前言1.1.1-路由策略 &#xff08;2&#xff09;、正反掩码和通配符1.2.1-通配符 &#xff08;3&#xff09;、ACL1.3.1-ACL步长1.3.2-步长的作用1.3.3-TCP/UDP端口号 实验1:实验2: 二、前缀列表实验1:2.1.1-前缀列表的表达式2…

【图像分割】DSNet: A Novel Way to Use Atrous Convolutions in Semantic Segmentation

DSNet: A Novel Way to Use Atrous Convolutions in Semantic Segmentation 论文链接&#xff1a;http://arxiv.org/abs/2406.03702 代码链接&#xff1a;https://github.com/takaniwa/DSNet 一、摘要 重新审视了现代卷积神经网络&#xff08;CNNs&#xff09;中的atrous卷积…

找工作小项目:day16-重构核心库、使用智能指针(1)

day16-重构核心库、使用智能指针 今天是该项目开源在gthub的最后一天&#xff0c;我这里只是将我自己对于这个项目的理解进行总结&#xff0c;如有错误敬请包含指正&#xff0c;今天会整体理一遍代码&#xff0c;并使用智能指针管理整个项目。 1、common 头文件 定义宏用于…

/usr/bin/ld: 当搜索用于 /lib/i386-linux-gnu/libcuda.so 时跳过不兼容的 -lcuda

/usr/bin/ld: 当搜索用于 /lib/i386-linux-gnu/libcuda.so 时跳过不兼容的 -lcuda ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/023dbdeb215b4b4580f7f54706e32af9.pn当使用unsloth做微调时&#xff0c;发现找不到libcuda&#xff0c;很自然想到需要软链接到最新…

线性代数|机器学习-P15矩阵A的低秩变换下的逆矩阵

文章目录 1. 单位矩阵的秩1变换1.1 功能说明1.2 证明 2. 单位矩阵 I n I_n In​的秩k变换3. 一般矩阵A的秩k变换 1. 单位矩阵的秩1变换 1.1 功能说明 假设我们有一个单位矩阵I&#xff0c;列向量u,v那么当我们对单位向量I减去秩为1的矩阵后&#xff0c;其逆等于多少&#xff…

IDEA2023中使用run Dashboard面板?实现批量运行微服务

1、直接点击Add service--->Run Configuration Type---->Spring Boot 2、这样就出现了run Dashboard面板&#xff0c;可同时运行多个工程模块&#xff0c;shift选中所有启动类组命名&#xff08;Group Configurations&#xff09; 3、启动所有的项目