自旋锁与适应性自旋锁

  • 概念引入
  • 自旋锁与非自旋锁流程图
  • 自旋锁的缺陷
  • 自旋锁的实现原理
  • 自适应自旋锁

概念引入

在介绍自旋锁之前,我们需要介绍一些前提知识来帮助大家理解自旋锁的概念。

阻塞或唤醒一个Java进程,需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间。如果同步代码块中的内容过于简单,状态转换花费的时间有可能比用户代码执行的时间还长。

在许多场景中,同步资源的锁定时间很短,为了这一小段时间去切换线程,线程挂起和恢复现场的时间花费可能会让系统得不偿失。如果物理机器有多个处理器,可以让两个或以上的线程并行执行,我们就可以让后面那个请求锁的线程不放弃CPU的执行时间,看看前面那个得到锁的线程是否会很快释放锁。

而为了让当前线程“稍等一下”,我们就需要让当前线程进行自旋,如果自旋完成后,持有锁的线程已经释放了锁,当前线程就可以不进入阻塞状态而是直接获得同步资源,避免的线程切换的开销,这就是自旋锁。

自旋锁与非自旋锁流程图

自旋锁的缺陷

自旋等待虽然避免了线程切换的开销,但它要占用处理器时间。如果锁被占用的时间很短,自旋的效果就很好。反之,如果所被占用的时间很长,自旋就是在白白浪费处理器时间。所以,自旋等待的时间必须要有限度,默认情况下是10次,也可以通过
-Xx:PreBloackSpin来更改。如果在自旋10次都没有获得锁,就应该挂起线程。

自旋锁的实现原理

自旋锁的实现原理同样也是CAS,AtomicInteger中调用unsafe进行自增操作源码中的do…while循环就是一个自旋操作,如果修改数值失败则通过循环来执行自旋,直到成功。

自适应自旋锁

自旋锁在Java1.6中改为默认开启,并引入了自适应的自旋锁。
自适应意味着自旋的次数不在固定,而是由前一次在同一个锁上的自旋时间和锁的拥有者的状态共同决定。
如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也是很可能再次成功的,进而它将会允许线程自旋相对更长的时间。
如果对于某个锁,线程很少成功获得过,则会相应减少自旋的时间甚至直接进入阻塞的状态,避免浪费处理器资源。

自旋锁与适应性自旋锁相关推荐

  1. 偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化

    JDK1.6 对锁的优化: 偏向锁.轻量级锁.自旋锁.适应性自旋锁.锁消除.锁粗化 等技术. 锁主要存在四中状态,依次是: 无锁状态 偏向锁状态 轻量级锁状态 重量级锁状态 锁可以升级不可降级,即 无 ...

  2. JUC并发编程系列详解篇十四(自旋锁 VS 适应性自旋锁)

    自旋锁 由于在多处理器环境中某些资源的有限性,有时需要互斥访问(mutual exclusion),这时候就需要引入锁的概念,只有获取了锁的线程才能够对资源进行访问,由于多线程的核心是CPU的时间分片 ...

  3. 锁9---自旋锁 VS 适应性自旋锁

    锁9-自旋锁 VS 适应性自旋锁 ************ 如有侵权请提示删除 *************** 文章目录 锁9---自旋锁 VS 适应性自旋锁 自旋锁 1.概念: 2.提出背景 3.自 ...

  4. java锁结构之自旋锁与适应性自旋锁

    一.为什么需要自旋锁与适应性自旋锁 1.1.自旋锁的提出背景   由于在多处理器环境中某些资源的有限性,有时需要互斥访问,这时候就需要引入锁的概念,只有获取了锁的线程才能对资源进行访问,由于多线程的核 ...

  5. 非自旋锁VS自旋锁和适应性自旋锁

    1.什么是自旋 所谓自旋,就是指当有另外一个线程来竞争锁时,这个线程会在原地循环等待,而不是把该线程给阻塞,直到那个获得锁的线程释放锁之后,这个线程就可以马上获得锁的.锁在原地循环的时候,是会消耗cp ...

  6. Java 中的悲观锁、乐观锁、自旋锁、适应性自旋锁、偏向锁、轻量级锁、重量级锁、公平锁、非公平锁、可重入锁、共享锁等

    参考文献: 不可不说的Java"锁"事 java并发进阶 感谢美团技术团队! 感谢JavaGuide!

  7. java 锁升级_Java并发 锁优化和锁升级

    前言 本篇文章介绍Java Synchronized锁优化. 锁是存在哪里的,怎么标识是什么锁 Monitor机制在Java中怎么表现的 锁优化 锁升级 1. 锁存在哪里 对象在内存中的布局分为三块区 ...

  8. 1.6的锁优化(适应性自旋/锁粗化/锁削除/轻量级锁/偏向锁)

    高效并发是JDK 1.6的一个重要主题,HotSpot虚拟机开发团队在这个版本上花费了大量的精力去实现各种锁优化技术,如适应性自旋(Adaptive Spinning).锁削除(Lock Elimin ...

  9. java适应性自旋锁_深夜!小胖问我,什么是自旋锁?怎么使用?适用场景是啥?...

    自旋锁 & 非自旋锁 什么是自旋?字面意思是 "自我旋转" .在 Java 中也就是循环的意思,比如 for 循环,while 循环等等.那自旋锁顾名思义就是「线程循环地去 ...

最新文章

  1. Java基础——类和对象的使用
  2. SharePoint Designer 2010创建限制筛选器
  3. 2021年中国一次性医用传感器市场趋势报告、技术动态创新及2027年市场预测
  4. eplan加密狗已损坏_EPLAN Electric P8 仿真加密狗 error 1068 问题
  5. 新年2021HTML,2021年了,来一段新年快乐的挂件源码
  6. windows 不安装jdk 运行 jar_详解Windows系统安装运行Mongodb服务(推荐)
  7. 台达内部速度指令_【2017年整理】台达B2伺服电机参数设定.doc
  8. 2022 百度之星程序设计大赛复赛 D.子序列2(动态dp/线段树维护矩阵)
  9. python下载网页中的pdf文件_Python下载PDF嵌入页面
  10. 中国大陆芯片设计企业名单
  11. 秀米svg点击显示另一张图_时隔五年再用秀米,我发现了这个超强玩法
  12. 利用宏合并一个工作薄下的多张表格方法
  13. 反编译获取小程序源码
  14. HCNP RoutingSwitching之MAC地址防漂移
  15. iOS 应用内购买(In-App Purchase)之开发
  16. kong及konga的最新版本安装
  17. JATG篇(1)——FT2232H入门
  18. iphone 各个设备的分辨率和对应的像素尺寸
  19. R语言——相关图的绘制
  20. 学完大数据开发一般可以胜任哪些工作?

热门文章

  1. 深度剖析 | SN 可微分学习的自适配归一化 (Switchable Normalization)
  2. 知乎上那些简短却非常深刻的回答
  3. verilog实现5分频
  4. 浅谈Android性能优化方案
  5. C++:构造函数以及析构函数
  6. 镜像神经元现象是什么,镜像神经元的作用
  7. Unity3D中如何调用序列帧图片为动画
  8. 【EMC电磁兼容】01.05——标准测试类目之EMI
  9. 数据备份、存储应该使用什么介质 光碟or硬盘or磁带
  10. 转区系统开放艾欧尼亚转入服务器,【英雄联盟】转区系统开放艾欧尼亚转入服务...