自旋锁

自旋锁是计算机科学用于多线程同步的一种锁,线程反复检查锁变量是否可用。由于线程在这一过程中保持执行,因此是一种忙等待。一旦获取了自旋锁,线程会一直保持该锁,直至显式释放自旋锁。

自旋锁避免了进程上下文的调度开销,因此对于线程只会阻塞很短时间的场合是有效的。因此操作系统的实现在很多地方往往用自旋锁。Windows操作系统提供的轻型读写锁(SRW Lock)内部就用了自旋锁。显然,单核CPU不适于使用自旋锁,这里的单核CPU指的是单核单线程的CPU,因为,在同一时间只有一个线程是处在运行状态,假设运行线程A发现无法获取锁,只能等待解锁,但因为A自身不挂起,所以那个持有锁的线程B没有办法进入运行状态,只能等到操作系统分给A的时间片用完,才能有机会被调度。这种情况下使用自旋锁的代价很高。

获取、释放自旋锁,实际上是读写自旋锁的存储内存或寄存器。因此这种读写操作必须是原子的。通常用test-and-set等原子操作来实现。

例子

汇编语言写的代码,运行于Intel 80386兼容处理器。

; Intel syntaxlocked:                      ; The lock variable. 1 = locked, 0 = unlocked.dd      0spin_lock:mov     eax, 1          ; Set the EAX register to 1.xchg    eax, [locked]   ; Atomically swap the EAX register with;  the lock variable.; This will always store 1 to the lock, leaving;  the previous value in the EAX register.test    eax, eax        ; Test EAX with itself. Among other things, this will;  set the processor's Zero Flag if EAX is 0.; If EAX is 0, then the lock was unlocked and;  we just locked it.; Otherwise, EAX is 1 and we didn't acquire the lock.jnz     spin_lock       ; Jump back to the MOV instruction if the Zero Flag is;  not set; the lock was previously locked, and so; we need to spin until it becomes unlocked.ret                     ; The lock has been acquired, return to the calling;  function.spin_unlock:mov     eax, 0          ; Set the EAX register to 0.xchg    eax, [locked]   ; Atomically swap the EAX register with;  the lock variable.ret                     ; The lock has been released.

参考链接

https://zh.wikipedia.org/wiki/%E8%87%AA%E6%97%8B%E9%94%81

https://www.cnblogs.com/xiaolincoding/p/13675202.html

自旋锁 - 搬运自维基百科相关推荐

  1. 树状数组(搬运自维基百科)

    树状数组(Fenwick_tree),最早由Peter M. Fenwick于1994年以A New Data Structure for Cumulative Frequency Tables为题发 ...

  2. 维基百科 百度百科:谁是真正的草根

    百度百科上线两个月了,自从上线以来,百度百科一直以"草根百科"的形象示人,它的运营者和拥趸们声称:相比于美国血统的中文维基百科,百度百科会吸引更多中国网民的参与,它更草根,它更适合 ...

  3. 维基百科:人人都能改写的网络百科全书

    维基百科:人人都能改写的网络"百科全书" --------------------------------------------------------------------- ...

  4. 操作系统自旋锁和互斥锁的实现原理

    0 介绍 对多线程编程有过了解的朋友一定知道锁的概念,它的作用是为了保证临界区的代码在多线程下能够正常工作,也就是说,锁将保证共享资源在任意时刻只能有一个使用者. 过去博主我也只是知道锁是如何使用的, ...

  5. OSI模型介绍维基百科

    OSI模型 维基百科,自由的百科全书 汉漢 ▼ OSI模型 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 OSI模型,即开放式通信系统互联参考模型(Open ...

  6. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

  7. 维基百科上的算法和数据结构链接很强大

    突然发现维基百科上的算法和数据结构比百度百科强多啦,图文并茂. 其实这个网站不错:http://www.sorting-algorithms.com 冒泡排序: bubble冒泡的意思 http:// ...

  8. mediawiki java api_维基百科 MediaWiki API 解析

    使用开放的 API 做一个自己的小项目,是一个很好的学习方法.但好像开放的 API 选择并不多.这里给大家多一个选择,简单介绍一下维基百科使用的 MediaWiki API. 简介 先简单介绍几个容易 ...

  9. 面试题-自旋锁,以及jvm对synchronized的优化

    背景 想要弄清楚这些问题,需要弄清楚其他的很多问题. 比如,对象,而对象本身又可以延伸出很多其他的问题. 我们平时不过只是在使用对象而已,怎么使用?就是new 对象.这只是语法层面的使用,相当于会了一 ...

最新文章

  1. 计算机主板的工作原理,计算机主板的工作原理.doc
  2. RenderingHints 参数
  3. 字节跳动高频算法题TOP100
  4. R树 mysql_为什么MySQL使用B+树作为索引
  5. hi3519av100 2.0版本sdk编译提示 cannot find uuid library required for mkfs.ubifs
  6. KMP POJ 3461 Oulipo
  7. 使用“另类” Cloud Foundry Gradle插件无需停机
  8. 菜鸟学习笔记:Java提升篇5(IO流1——IO流的概念、字节流、字符流、缓冲流、转换流)
  9. 35KV变电站及10KV供配电系统倒闸操作屏QY-PGD09
  10. 鹏业安装算量图元属性中的扣除标记功能
  11. windows查看系统补丁
  12. Elite教程系列(一):快速上手
  13. 应用之星教你制作高下载量的App
  14. SDL2音视频渲染入门
  15. 官网申请Intellij IDEA Ultimate教育许可证详细步骤
  16. Git-Gitee多人协作
  17. 美图DPOS共识机制ETH节点网络启动和测试
  18. Java8新特性-Optional
  19. UG和Solidworks的比较
  20. MY-EC20 Linux-3.14.52 测试手册

热门文章

  1. 1000+道 互联网Java架构师面试题
  2. 计算机系统的组成刷题,驾考刷题宝典电脑版2021试题
  3. 用python给游戏加上音效_pygame游戏之旅 添加icon和bgm音效的方法
  4. ARP欺骗原理以及路由器的先天免疫(转)
  5. 快应用开发快速上手及简明教程
  6. 〖大前端 - 基础入门三大核心之JS篇㉕〗- JavaScript 的数组的常用方法 (二)
  7. 安卓 linux找回内置存储,安卓手机坏了拆eMCP/EMMC闪存恢复数据教程
  8. 响应式布局 简单案例
  9. 梦幻摩天轮——用CSS写一个元素发光以及圆盘旋转的效果
  10. 遥感影像波段/通道bands