轻量级锁在加锁过程中,用到了自旋锁

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

注意,锁在原地循环的时候,是会消耗cpu的,就相当于在执行一个啥也没有的for循环。

所以,轻量级锁适用于那些同步代码块执行的很快的场景,这样,线程原地等待很短的时间就能够获得锁了。

自旋锁的使用,其实也是有一定的概率背景,在大部分同步代码块执行的时间都是很短的。所以通过看似无异议的循环反而能提升锁的性能。

但是自旋必须要有一定的条件控制,否则如果一个线程执行同步代码块的时间很长,那么这个线程不断的循环反而会消耗CPU资源。默认情况下自旋的次数是10次,可以通过 preBlockSpin来修改

在JDK1.6之后,引入了自适应自旋锁,自适应意味着自旋的次数不是固定不变的,而是根据前一次在同一个锁上自旋的时间以及锁的拥有者的状态来决定。

如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也是很有可能再次成功,进而它将允许自旋等待持续相对更长的时间。如果对于某个锁,自旋很少成功获得过,那在以后尝试获取这个锁时将可能省略掉自旋过程,直接
阻塞线程,避免浪费处理器资源

轻量级锁的加锁和解锁逻辑-自旋锁相关推荐

  1. 轻量级锁的加锁和解锁逻辑

    锁升级为轻量级锁之后,对象的Markword也会进行相应的的变化.升级为轻量级锁的过程: 1. 线程在自己的栈桢中创建锁记录 LockRecord. 2. 将锁对象的对象头中的MarkWord复制到线 ...

  2. 【面试 分布式锁详细解析】续命 自旋锁 看门狗 重入锁,加锁 续命 解锁 核心源码,lua脚本解析,具体代码和lua脚本如何实现

    Redisson实现分布式锁原理 自己实现锁续命 在 controller 里开一个 线程 (可以为 守护线程) 每10秒,判断一个 这个 UUID是否存在,如果 存在,重置为 30秒. 如果不存在, ...

  3. 自旋锁和互斥锁实例_多线程编程之自旋锁

    一.什么是自旋锁 一直以为自旋锁也是用于多线程互斥的一种锁,原来不是! 自旋锁是专为防止多处理器并发(实现保护共享资源)而引入的一种锁机制.自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用 ...

  4. Linux 锁机制(3)之自旋锁

    Linux 锁机制(3)之自旋锁 1. 自旋锁 1.1 两种锁 1.2 自旋锁 1.3 自旋名字来源:自旋锁一直循环等待,直到获取锁为止. 1.4 自旋锁优点: 2 自旋锁特点/使用: 2.1 临界区 ...

  5. 自旋锁与互斥锁的对比、手工实现自旋锁

    自旋锁与互斥锁的对比.手工实现自旋锁 版权声明:本文为博主原创文章,转载请注明出处,谢谢. https://blog.csdn.net/FreeeLinux/article/details/53695 ...

  6. 一文看懂临界区、互斥锁、同步锁、临界区、信号量、自旋锁等名词!

    点击上方"业余草",选择"置顶公众号" 第一时间获取技术干货和业界资讯! 关于线程安全的专有名词有一大堆.你们突然之间问我这个名词是什么意思,那个名词是什么意思 ...

  7. 锁优化:逃逸分析、自旋锁、锁消除、锁粗化、轻量级锁和偏向锁

    1. 逃逸分析 Escape Analysis 1.1 逃逸分为两种: 方法逃逸:当一个对象在方法中被定义后,可能作为调用参数被外部方法说引用. 线程逃逸:通过复制给类变量或者作为实例变量在其他线程中 ...

  8. Redis实现分布式锁:加锁、解锁、续租和一致

    目录 分布式锁及其应用场景 为何需要分布式锁 分布式锁的特性 互斥性 不死锁 一致性 可重入性 支持阻塞和非阻塞: 支持公平锁和非公平锁(可选) 使用原生Redis实现分布式锁 加锁 解锁 续租 如何 ...

  9. Juc07_乐观锁和悲观锁、公平锁和非公平锁、递归锁(可重入锁)、死锁及排查、自旋锁

    文章目录 ①. 乐观锁和悲观锁 ②. 公平锁和非公平锁 ③. 可重入锁(又名递归锁) ④. 死锁及排查 ⑥. 自旋锁 ①. 乐观锁和悲观锁 ①. 悲观锁(synchronized关键字和Lock的实现 ...

最新文章

  1. ZooKeeper和CAP理论及一致性原则
  2. python绘制动态模拟图-Python实现模拟时钟代码推荐
  3. linux fedora安装simplescreenrecorder
  4. 上海计算机二级报名无法选择,上海2020年二级计算机怎么报名
  5. python生成规定随机数_python生成随机数的方法
  6. 如何突破瓶颈又释放工作量? 深度剖析《闪耀暖暖》游戏从2D到3D的美术开发过程
  7. 吉林省统考计算机英语作文,2019年吉林省学位英语作文必背范文(我最……的题材) - 希赛网...
  8. 2、运行WordCount程序
  9. matlab批量将mp3文件转wav文件
  10. 离散数学 之 命题公式的主析取合取范式(java实现)
  11. 我的读书笔记 -《裸猿》
  12. 动画云渲染【渲染101】渲染小提示
  13. 通用输入/输出接口 GPIO
  14. 智慧校园,用“智慧”培育“未来之花”
  15. hadoop 2.6遇到的DataNode无法启动问题
  16. java 过滤微信昵称_java过滤微信昵称emoji表情与非emoji的问题解决方法
  17. 单片机方案设计红外人体测温仪方案
  18. esp8266驱动电机
  19. 欧姆龙 PLC 程序NJ ST语言EtherCat总线控制 24个伺服轴大型程序电池生产线 包括PLC NJ-1400和威纶通触摸屏程序
  20. EL PSY CONGROO

热门文章

  1. 9. Approximate Inference
  2. 一个程序员的奋斗经历1
  3. NetBeans Weekly News - Issue # 446 - Jul 20, 2010
  4. 怎么才能学好Java编程写好Java代码?
  5. git 创建 本地 裸 仓库
  6. python 全栈开发,Day116(可迭代对象,type创建动态类,偏函数,面向对象的封装,获取外键数据,组合搜索,领域驱动设计(DDD))...
  7. Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度
  8. java 18 -4 LinkedHashMap集合
  9. URAL-1982 Electrification Plan 最小生成树
  10. 在Struts2 的Action中怎样获取表单提交上来的多个checkbox的值