什么是Java自旋锁

 更新时间:2022年01月25日 15:45:37   作者:一江溪水   
这篇文章主要介绍了什么是Java自旋锁,在有些场景中,同步资源的锁定时间很短,为了这一小段时间去切换线程,线程挂起和恢复现场的花费可能会让系统得不偿失,下面来了解具体内容介绍吧

前言:

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

1.自旋锁

在有些场景中,同步资源的锁定时间很短,为了这一小段时间去切换线程,线程挂起和恢复现场的花费可能会让系统得不偿失。

如果机器有多个CPU核心,能够让两个或以上的线程同时并行执行,我们就可以让后面那个请求锁的线程不放弃CPU的执行时间,看看持有锁的线程是否很快就会释放锁。

为了让当前线程“稍等一下”,我们需让当前线程进行自旋,如果在自旋完成后前面锁定同步资源的线程已经释放了锁,那么当前线程就可以不必阻塞而是直接获取同步资源,从而避免切换线程的开销。这就是自旋锁。

2.工作流程

3.缺点

自旋锁本身是有缺点的,它不能代替阻塞。自旋等待虽然避免了线程切换的开销,但它要占用处理器时间。

  • 如果锁被占用的时间很短,自旋等待的效果就会非常好;
  • 如果锁被占用的时间很长,那么自旋的线程只会白浪费处理器资源。

所以,自旋等待的时间必须要有一定的限度,如果自旋超过了限定次数没有成功获得锁,就应当挂起线程。(这个次数默认是10次,可以配置)

4.实现原理

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

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;
}

5.自适应自旋

自适应意味着自旋的时间(次数)不固定,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。

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

到此这篇关于什么是Java自旋锁的文章就介绍到这了,更多相关Java自旋锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 鸿蒙HarmonyOS App开发造轮子之自定义圆形图片组件的实例代码

    鸿蒙HarmonyOS App开发造轮子之自定义圆形图片组件的实例代码

    这篇文章主要介绍了鸿蒙HarmonyOS App开发造轮子之自定义圆形图片组件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 注解、原生Spring、SchemaBased三种方式实现AOP代码案例

    注解、原生Spring、SchemaBased三种方式实现AOP代码案例

    这篇文章主要介绍了注解、原生Spring、SchemaBased三种方式实现AOP的方法介绍,文中有详细的代码示例,对我们的学习有一定的帮助,需要的朋友可以参考下
    2023-06-06
  • springcloud-gateway集成knife4j的示例详解

    springcloud-gateway集成knife4j的示例详解

    这篇文章主要介绍了springcloud-gateway集成knife4j的示例详解,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Java计算几何图形面积的实例代码

    Java计算几何图形面积的实例代码

    这篇文章主要介绍了Java计算几何图形面积的实例代码,需要的朋友可以参考下
    2014-03-03
  • 配置Ant执行Jmeter脚本过程详解

    配置Ant执行Jmeter脚本过程详解

    这篇文章主要介绍了配置Ant执行Jmeter脚本过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • java理论基础Stream reduce实现集合元素归约

    java理论基础Stream reduce实现集合元素归约

    这篇文章主要为大家介绍了java理论基础Stream reduce实现集合元素归约示例详解有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 10个Java程序员熟悉的面向对象设计原则

    10个Java程序员熟悉的面向对象设计原则

    这篇文章主要为大家详细介绍了Java程序员应当知道的10个面向对象设计原则,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Java构造器使用方法及注意事项

    Java构造器使用方法及注意事项

    这篇文章主要介绍了Java构造器使用方法及注意事项的相关资料,这里举例说明如何使用构造器及需要注意的地方,需要的朋友可以参考下
    2017-07-07
  • java代理模式与动态代理模式详解

    java代理模式与动态代理模式详解

    代理就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用
    2014-02-02
  • Java实现定时备份文件

    Java实现定时备份文件

    这篇文章主要为大家详细介绍了Java实现定时备份文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论