文章目录

  • 前言
  • 一、什么是自旋锁?
  • 二、为什么要用自旋锁?
  • 三、实例讲解
    • AtomicInteger
  • 四、自己实现一个可重入的自旋锁
  • 五、缺点及适应场景
    • 缺点
    • 适用场景
  • 总结

前言

自旋锁是个比较基础的知识点了,应该很熟悉的掌握。


一、什么是自旋锁?

自旋”可以理解为“自我旋转”,这里的“旋转”指“循环”,比如 while 循环或者 for 循环。“自旋”就是自己在这里不停地循环,直到目标达成。而不像普通的锁那样,如果获取不到锁就进入阻塞。

自旋锁并不会释放CPU的时间片,而是通过自旋的方式不断地去尝试获取锁,如果尝试获取失败,那么就一直尝试,直到成功获取到为止。

二、为什么要用自旋锁?

如果一个临界区的内容很“短小”,那么如果使用线程获取不到锁就“阻塞”的方式来加锁,那么线程状态切换的开销很可能大于临界区内容执行的开销,效率较差。如果一个线程在发现临界区已经被“占用”的情况下,通过一定次数的[自旋]来等待这个已经获取临界区使用权的线程释放锁,那么就可以一定程度下避免频繁的线程切换,从而提高效率。

三、实例讲解

1.5开始,java.util.concurrent.atomic包中的原子类基本都有自旋锁的影子。

AtomicInteger

    public final int getAndIncrement() {return unsafe.getAndAddInt(this, valueOffset, 1);}

看下这个自增调用的方法

    public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {var5 = this.getIntVolatile(var1, var2);} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;}

这里的do while就是一个自旋操作,如果在修改过程中遇到其它线程争夺修改导致自己修改失败的情况下,就一直死循环重新去尝试加一,直到成功为止。

四、自己实现一个可重入的自旋锁

TODO : ==''

五、缺点及适应场景

缺点

避免线程状态切换带来的开销的同时,引入了新的开销,因为自旋锁需要一直不断地去尝试获取锁。如果锁一直不被释放,或者锁的耗时过长,都会导致自旋的无用尝试,白白浪费处理器资源。

适用场景

自旋锁的使用需要同时满足以下两个条件:

  1. 并发度不高
  2. 临界区简短不复杂

以上两个条件其实都是为了保证自旋可以尽快结束,避免浪费CPU资源。


总结

自旋锁可以提高程序效率,但是一定要注意使用场景,否则会适得其反。

【线程知识点】-- 自旋锁相关推荐

  1. 驱动开发笔记1—内核中的事件、进程、线程、自旋锁

    内核模式下的等待 KeWaitForSingleObject() 和 KeWaitForMultipleObjects() NTSTATUS KeWaitForSingleObject(IN PVOI ...

  2. 线程安全: 互斥锁和自旋锁(10种)

    无并发,不编程.提到多线程就很难绕开锁?. iOS开发中较常见的两类锁: 1. 互斥锁: 同一时刻只能有一个线程获得互斥锁,其余线程处于挂起状态. 2. 自旋锁: 当某个线程获得自旋锁后,别的线程会一 ...

  3. 关抢占 自旋锁_互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景

    前言 生活中用到的锁,用途都比较简单粗暴,上锁基本是为了防止外人进来.电动车被偷等等. 但生活中也不是没有 BUG 的,比如加锁的电动车在「广西 - 窃·格瓦拉」面前,锁就是形同虚设,只要他愿意,他就 ...

  4. 华为应用锁退出立即锁_面试官:你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景...

    前言 生活中用到的锁,用途都比较简单粗暴,上锁基本是为了防止外人进来.电动车被偷等等. 但生活中也不是没有 BUG 的,比如加锁的电动车在「广西 - 窃·格瓦拉」面前,锁就是形同虚设,只要他愿意,他就 ...

  5. C# lock 语法糖实现原理--《.NET Core 底层入门》之自旋锁,互斥锁,混合锁,读写锁...

    在多线程环境中,多个线程可能会同时访问同一个资源,为了避免访问发生冲突,可以根据访问的复杂程度采取不同的措施 原子操作适用于简单的单个操作,无锁算法适用于相对简单的一连串操作,而线程锁适用于复杂的一连 ...

  6. 各类锁(互斥锁,自旋锁,读写锁,乐观锁,悲观锁,死锁)

    互斥锁 当有一个线程要访问共享资源(临界资源)之前,会对线程访问的这段代码(临界区)进行加锁.如果在加锁之后没释放锁之前其他线程要对临界资源进行访问,则这些线程会被阻塞睡眠,直到解锁,如果解锁时有一个 ...

  7. 面试官:你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景?

    前言 生活中用到的锁,用途都比较简单粗暴,上锁基本是为了防止外人进来.电动车被偷等等. 但生活中也不是没有 BUG 的,比如加锁的电动车在「广西 - 窃·格瓦拉」面前,锁就是形同虚设,只要他愿意,他就 ...

  8. 高性能自旋锁 MCS Spinlock 的设计与实现(来自IBM)

    引言 林 昊翔 (linhaoxiang@hotmail.com), Linux 内核爱好者 林昊翔,计算机科学硕士,毕业于清华大学计算机系,Linux 内核爱好者 秦 君 (qinjun@cn.ib ...

  9. 读写自旋锁详解,第 3 部分(来自IBM)

    基于简单共享变量的读写自旋锁的不足 本系列文章的第 2 部分中给出的实现都基于简单共享变量,简洁实用,但在大规模多核.NUMA 系统上可扩展性较差.我们说某个读写自旋锁的实现是可扩展的,通俗地讲是指在 ...

  10. C++性能优化(十二)——自旋锁

    一.互斥锁 1.互斥锁简介 互斥锁属于sleep-waiting类型锁.Linux Kernel 2.6.x稳定版开始,Linux的互斥锁都是futex (Fast Usermode Mutex)锁. ...

最新文章

  1. hung-yi lee_p11_逻辑回归
  2. kill 进程_Node.js 进程平滑离场剖析
  3. 2016百度之星 - 资格赛(Astar Round1)
  4. css技巧之如何实现ul li边框重合
  5. 查看node状态_第六章 无限可能,神器降临——Node-RED
  6. cf769D(枚举位或运算)
  7. 龙果学院mysql分布式集群代码_龙果学院-MySQL大型分布式集群解决方案
  8. pfsense 2.2RC版本应用
  9. python爬虫beautifulsoup_python爬虫beautifulsoup解析html方法
  10. 格式化字符串,不足补零
  11. 【技术评测】ArcBlock:试图一同江湖的网络层,实现难度比较大
  12. 如何列出包含给定提交的分支?
  13. 对于stackoverflow的中文翻译的相关问题
  14. 挂机平台android,红手指手游挂机平台
  15. Java中的锁有哪些?
  16. 2021-02-10微软漏洞通告
  17. 电商、数字化下的中国书店
  18. 如何用HTML和css实现拼图,打造自己的html5拼图小游戏
  19. 怎么把视频压缩成表情包?如何把视频做成GIF动图
  20. mysql8 Record Locks ,Gap Locks, Next-Key Locks实验2 唯一索引和非唯一索引,无索引情况

热门文章

  1. excel导出java.lang.ArrayIndexOutOfBoundsException:-32768
  2. Lua计算kronecker 积、Khatri-Rao积、Hadamard积、普通矩阵乘积
  3. 使用Servlet和JSP开发Java应用程序 ---- 查询四六成绩
  4. C# word文档转换成PDF格式文档
  5. 机器学习在无线信道建模中的应用现状与展望
  6. 【单片机仿真】(九)指令系统 — 算术运算指令 之 ADD、ADDC、SUBB、INC、DEC、DA
  7. Redis Eviction policies (驱逐策略)
  8. 解决clion多个mian函数问题
  9. archlinux安装到美化
  10. 微信公众号新上线“快捷私信”功能 微信留言功能没有的号迎来转机