自旋锁是什么?

article/2025/8/20 15:36:14

本文内容如有错误、不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢。

文章目录

        • 定义
        • 特点
        • 和互斥锁比较
          • 适用场景
        • 结论
            • 混合是什么意思?
        • 结尾
        • 参考资料

定义

自旋锁 spin lock

下面内容摘自维基百科

在这里插入图片描述

在软件工程中,自旋锁是一种锁,它使试图获取它的线程在循环(“自旋”)中简单地等待,同时反复检查该锁是否可用。由于线程保持运行状态,但未执行有用的任务,因此使用这种锁是一种繁忙的等待。一旦获得了自旋锁,通常将一直保持这种状态,直到显式释放它们为止,尽管在某些实现中,如果正在等待线程(持有锁的线程)阻塞或“进入睡眠状态”,则它们可能会自动释放。

因为自旋锁避免了操作系统进程上下文切换带来的CPU消耗,所以如果线程可能仅在短时间内被阻塞,则自旋锁非常有效。因此,操作系统内核经常使用自旋锁。但是,自旋锁如果保持更长的时间会变得很浪费,因为它们可能会阻止其他线程运行。线程持有锁的时间越长,则持有该锁的线程将被OS调度程序中断的风险越大。如果发生这种情况,则其他线程将保持“旋转”状态(反复尝试获取该锁),而持有该锁的线程在释放它方面并未取得进展。结果是无限期推迟,直到持有锁的线程可以完成并释放它为止。在单处理器系统上尤其如此,在该系统上,每个具有相同优先级的等待线程都可能浪费其量子时间(线程可以运行的分配时间)旋转,直到持有锁的线程最终完成。

特点

根据上面的描述可以总结自旋锁以下几个特点:

  • 在循环中,线程反复简单地等待(“旋转”)检查,直到锁可用为止。
  • 自旋锁(spin lock)是一种繁忙的等待,因为线程通过执行无用的任务(例如空for循环),而保持活动状态。
  • 当自旋锁在只自旋很短的时间时,效率非常高。
  • 如果自旋时间较长,可能会造成浪费。

和互斥锁比较

互斥锁的问题是使线程进入睡眠状态并再次唤醒它们都是相当耗时的操作,并且需要执行大量的CPU指令。如果现在互斥锁仅锁定很短的时间,则使线程进入睡眠状态并再次唤醒它所花费的时间可能会超过该线程实际睡眠的时间,甚至可能超过该线程将要执行睡眠的时间。不断轮询自旋锁浪费了CPU的时间,如果自旋锁保持更长的时间,则浪费更多的CPU时间,而如果线程处于睡眠状态会更好。

适用场景

在单核/单CPU系统上使用自旋锁是没有意义的,因为只要自旋锁轮询阻止了唯一可用的CPU内核,其他线程就无法运行,并且由于没有其他线程可以运行,因此锁不会被解锁。自旋锁只会浪费那些系统上的CPU时间,没有真正的好处。如果改为让该线程进入睡眠状态,则另一个线程可能会立即运行,可能会解除锁定,然后在第一个线程再次唤醒后允许其继续处理。

在多核/多CPU系统上,只有大量锁定仅在很短的时间内保持不变,浪费时间不断使线程进入睡眠状态并再次唤醒它们可能会显着降低运行时性能。当使用自旋锁时,线程有机会利用其完整的运行时长(始终仅在很短的时间段内阻塞,然后立即继续其工作),从而提高了处理吞吐量。

结论

由于开发人员是无法预先知道互斥或自旋锁是否会更好(例如,因为目标体系结构的CPU内核数量未知),因此操作系统也无法知道某个代码段是否已针对单核或Windows优化。在多核环境中,大多数系统并不严格区分互斥锁和自旋锁。实际上,大多数现代操作系统都具有混合互斥锁和混合自旋锁。

混合是什么意思?

混合互斥锁首先在多核系统上的行为就像自旋锁。如果线程无法锁定互斥锁,则不会立即进入休眠(sleep)状态,因为互斥锁可能很快就会被解锁,因此互斥锁将首先表现得像自旋锁。只有在一定时间(或重试或任何其他测量因素)之后仍未获得锁定时,线程才真正进入睡眠状态。如果相同的代码在只有一个内核的系统上运行,则互斥锁将不会自旋锁。

混合自旋锁起初的行为类似于普通自旋锁,但为避免浪费过多的CPU时间,它可能有一个后置(back-off) 策略(strategy)。它通常不会使线程立即进入睡眠状态(因为使用自旋锁时不会发生这种立即进入睡眠状态情况),但是它在一定情况下(在一定时间后停止)将会停止线程,允许另一个线程运行,因此增加了自旋锁被解锁(unlock)的机会(纯线程切换通常比涉及使线程进入休眠状态并稍后唤醒它更节省效率(waking it up))。

结尾

自旋锁不但出现在操作系统中,在编程中也经常出现,比如Atomic类中的自旋判断。实现方式如下

AtomicInteger.java

public final int getAndUpdate(IntUnaryOperator updateFunction) {int prev, next;do {prev = get();next = updateFunction.applyAsInt(prev);} while (!compareAndSet(prev, next));return prev;}

代码中的do-while语句块就是自旋锁的示例。

参考资料

When should one use a spinlock instead of mutex?(什么时候应该使用自旋锁而不是互斥锁?

  • https://stackoverflow.com/questions/5869825/when-should-one-use-a-spinlock-instead-of-mutex

What is a spin lock? (什么是自旋锁

  • https://www.ibm.com/support/pages/what-spin-lock

What is spin lock?(什么是自旋锁

  • https://www.careerride.com/OS-what-is-spin-lock.aspx

Spinlock(自旋锁

  • https://en.wikipedia.org/wiki/Spinlock

http://chatgpt.dhexx.cn/article/3jX2e3E3.shtml

相关文章

【自旋锁】

1. 原理 PV操作原理 记录一个锁定状态(就是一个共享资源,基于原子操作) 2. 适用 1. 解决多cpu之间的竞态 2. 可以解决中断程序和普通程序之间的竞态(自旋锁可以用于中断上下文) 3. 加锁时间不宜过长 4. 获得自旋锁期间,不能进行调度(sleep) 例&#xff1…

量子力学之电子自旋与四个量子数

量子力学之电子自旋与四个量子数 前言一、电子自旋是什么?二、四个量子数1.主量子数 n2.角量子数*l*3.磁量子数ml4.自旋量子数ms 三.例题 前言 在笔者学习大学物理量子力学部分时,对此部分非常疑惑,弄明白之后写下来以供查看,水平…

学习自旋电子学的笔记03:初试自旋波模拟

文章目录 前言一、初遇1.Figure S2 (a)2.图4-23.Figure S1 二、暂别1.FFT分析程序包:MFA简介2.使用练习MFA 三、重逢3.Figure S14.FIG.2 (a)5.FIG.2 (b)6.FIG.5 总结 _ _ 远行! 前言 四月,过得四真的快啊,这是从入学到现在的第9个…

深入理解CAS (自旋锁)

文章目录 0. 导言1. 什么是CAS2. 保证原子操作2.1 CAS 实现自旋锁2.2 AtomicBoolean 中的CAS2.3 CAS使用场景 3. 锁的分类3.1 乐观锁3.2 悲观锁 4. CAS存在的问题4.1 ABA问题4.2 循环时间长开销大4.3 只能保证一个共享变量的原子操作 0. 导言 背景: 我们都知道&…

CAS和自旋锁

什么是CAS CAS算法(Compare And Swap),即比较并替换,是一种实现并发编程时常用到的算法,Java并发包中的很多类都使用了CAS算法。 CAS算法有3个基本操作数: 内存地址V旧的预期值A要修改的新值B CAS使用自…

Java中的自旋锁,手动实现一个自旋锁

自旋锁 CAS是实现自旋锁的基础,CAS利用CPU指令保证了操作的原子性,已达到锁的效果。自旋是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁, 当线程发现锁被占用时,会不断循环判断锁的状态,直到获取。这样的好处是减少线程上下文切换的消耗,缺点是循环…

学习自旋电子学的笔记04:模拟自旋波在弯曲磁畴壁中传播

文章目录 前言零、笔记03中错误的补充改正1.保持电子的极化方向不变的原因2.Oxs_SpinXferEvolve类的额外补充说明3.时间演化器的时间步长相关补充说明 一、文章概述和要复现的微磁模拟1.文章概述2.要复现的微磁模拟 二、FIG.1三、 FIG.21. FIG.2(a-b)2. FIG.2(c-f) 四、 FIG.3五…

CAS和自旋到底是一个概念吗?

问题: CAS是 compare and swap ,就是一个比较工作内存和主内存的值是否相同,相同的话,就用新值来替换这么一个操作。 但是,为什么好多地方都说这是自旋呢? 我理解比较一次的话,成功就返回true了,失败&am…

CAS及CAS自旋

1. CAS简介 比较并交换(compare and swap, CAS),是原子操作的一种。在多线程没有锁的状态下,可以保证多个线程对同一个值的更新。 CAS可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定…

自旋玻璃(spin glass)、自旋冰(spin ice)和量子自旋液体(quantum spin liquid)(之二)

文章目录 13. 几何阻挫(Geometrical frustration)13.1 磁序(Magnetic ordering)13.2 数学定义13.3 水冰(water ice)13.4 Paulings model 的扩展:广义的阻挫13.5 人工几何阻挫铁磁体13.6 没有晶格…

CAS自旋

文章目录 1. CAS简介2. CAS的特点3. 自旋–比较和交换4. 什么是ABA问题5. ABA问题怎么解决6. 悲观锁7. 乐观锁8. CAS锁升级 CAS面试提问环节: synchronized、ReentrantLock、CAS全家桶发售HashMap、Hashtable、ConcurrentHashMap组合拳出击 1. CAS简介 比较并交换(…

自旋玻璃(spin glass)、自旋冰(spin ice)和量子自旋液体(quantum spin liquid)(之一)

文章目录 1. Giorgio Parisi 简介2. 复杂无序系统2.1 相变、序参量与对称性破缺2.2 复杂系统 3. 自旋玻璃简介3.1 自旋冻结3.2 亚稳态3.3 磁化弛豫3.4 玻璃化和无序系统3.5 Ising model3.6 自旋玻璃模型3.7 自旋玻璃相变 4. 磁场中的现象5. Edwards-Anderson model6. Sherringt…

office卸载工具怎么用(官方干净卸载方法)

https://jingyan.baidu.com/article/39810a23593f37b636fda60d.html

Office卸载安装问题

卸载Office 问题描述 此前已安装过新的Office,按照正常的卸载流程卸载后(控制面板卸载后),安装新的Office时,提示: 无法安装64位版本的Office,因为在电脑上已有32位程序。如下图所示。 **解…

32位office卸载不干净怎么办如何删除32位Office

以前在电脑上安装了32位系统的Office,现在想要换成64位的Office,但是在安装的时候提示无法进行安装,需要先卸载以前的32位Office,出现这种情况怎么办呢?如何彻底卸载干净32位系统的Office呢?下面就一起来看…

Office卸载不干净,注册表项权限修改后仍然无法删除的问题

Office卸载不干净,注册表项权限修改后仍然无法删除的问题 针对卸载Office最极端的情况,试试以下方法。 1.卸载开始菜单的office; 可以借助以下工具进行进行清除,完全卸载(但是对本人无效) 链接:https://…

mac m1 office卸载重装(学校官方正版)

卸载office 1、应用程序中将所有的microsoft相关软件移到废纸篓,可能还有outlook或者onedrive,清空废纸篓 2、cmdshiftG,输入/Library/Preferences,删除所有com.Microsoft开头的文件 3、进入/Library/PrivilegedHelperTools&…

卸载32位office安装64位office卸载不完全导致不能安装64位office时解决办法

转载自https://blog.csdn.net/zzfenglin/article/details/60780831 问题描述 安装64位office办公软件的时候提示已经安装32位的office办公软件所以无法继续安装,但实际上之前安装的32位的office办公软件已经卸载了。问题现象截图如下: 解决办法 从问题描…

office2019 完美卸载

记录下我日常手贱的经历。 事情的起因呢,是在家办公的时候呢,突然要写一份文档,然后呢,我的wps过期了,只能看,而不能编辑。然后我就打算装个office2019感受下。结果我就卸载了原来安装过但是已经过期了的o…

Office uninstall(专业office卸载工具)绿色单文件版V1.8.3 全面清除office卸载残留

Office uninstall 是一款专门为微软Office办公软件量身定做的office卸载工具,可以帮助大家彻底卸载已经安装到电脑上的Office软件,彻底解决office卸载不干净,无法重新安装的问题,全面兼容office2003、office2007、office2010、off…