自旋锁与适应性自旋锁

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

概念引入

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

阻塞或唤醒一个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. 测试ESP32S基本模块的功能,并验证是否可以应用在AI智能车竞赛检测激光信号中
  2. 故障排查:是什么 导致了客户端批量心跳超时掉线
  3. the code place where the binding is converted to final value displayed in u
  4. 匿名包装器(function(){})()
  5. uc3842改可调电源教程_36W LED 防水电源
  6. mysql有状态无状态_k8s statefulSet 有状态应用和无状态应用区别
  7. linux mysql怎么建数据库用户,Linux MySQL新建用户
  8. 使用valgrind对gperftools(tcmalloc)进行内存泄漏和越界检测
  9. sql server 群集_SQL Server 2014 –安装群集实例–分步(3/3)
  10. [转载] [转载] python 中NumPy和Pandas工具包中的函数使用笔记(方便自己查找)
  11. 计算机视觉实战 (一) 开个视觉实战专栏
  12. android studio安装路径错误,部署 - Android Studio - 本地路径不存在
  13. 删除AdminServer logs下的log文件后开启AdminServer报错
  14. synchronized工作原理剖析(二)
  15. 【C++/Python 双语言实现】Luogu1196 银河英雄传说 + Python函数的定义与调用
  16. inav向STM32F401CCU开发板定制的过程(二)
  17. 钟晱晱,首富不是终点
  18. 网络广告的效果测定与评估
  19. Spring AOP:原理、 通知、连接点、切点、切面、表达式
  20. Gzip的动态压缩和静态压缩详解

热门文章

  1. 哈工程计算机考研复试各科总分,考研复试总分是多少
  2. 梁宁-产品思维-笔记
  3. sql查询ID=1与数据后几条,并且将查询的两个数据显示在一个查询窗口中
  4. 需要很多邮箱怎么办?分享几个不错的办法可无限安全生成多个邮箱
  5. 美国国土安全部仍然使用 COBOL 语言
  6. 智能优化及其应用——课程实验(粒子群算法)
  7. SNMP协议以及著名的MIB详解
  8. (M)Dynamic Programming:309. Best Time to Buy and Sell Stock with Cooldown
  9. 基于百度AI平台的植物识别系统 新手适用!!
  10. csr867x入门之串口AT指令协议(三)