什么是Java自旋锁

作者:一江溪水? 时间:2022-09-22 22:10:55 

前言:

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

1.自旋锁

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

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

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

2.工作流程

什么是Java自旋锁

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.自适应自旋

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

  • 如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也是很有可能再次成功,进而它将允许自旋等待持续相对更长的时间。

  • 如果对于某个锁,自旋很少成功获得过,那在以后尝试获取这个锁时将可能省略掉自旋过程,直接阻塞线程,避免浪费处理器资源。

来源:https://blog.csdn.net/upstream480/article/details/122272332

标签:Java,自旋锁
0
投稿

猜你喜欢

  • C# Random类随机函数实例详解

    2021-09-12 04:26:42
  • WPF实现自带触控键盘的文本框

    2023-08-25 15:23:20
  • 详解Springboot对多线程的支持

    2023-09-21 02:18:21
  • C++类常量和类枚举

    2022-05-05 17:07:47
  • MyBatis动态SQL标签用法实例详解

    2023-11-26 01:04:27
  • Java并发编程同步器CountDownLatch

    2022-10-17 18:59:34
  • Qt for Android开发实例教程

    2023-06-27 10:00:39
  • C语言中队列的结构和函数接口的使用示例

    2022-01-08 06:56:40
  • C++实现String类的方法详解

    2023-04-27 08:49:27
  • 浅谈JAVA设计模式之享元模式

    2021-09-22 10:12:06
  • Spring中IOC和AOP的深入讲解

    2023-11-19 10:20:59
  • 以实例简介Java中线程池的工作特点

    2023-08-11 23:04:19
  • Java多文件以ZIP压缩包导出的实现方法

    2023-10-08 14:05:20
  • pagehelper踩坑记之分页乱套问题解决

    2021-11-14 14:19:34
  • c# winform异步不卡界面的实现方法

    2021-10-03 22:27:33
  • Java 17 更快的 LTS 节奏

    2023-07-08 11:36:19
  • java中dart类详细讲解

    2022-01-23 13:01:13
  • Android百度地图应用开发基础知识

    2023-04-14 12:31:58
  • C#中static的详细用法实例

    2021-05-27 21:37:00
  • C# 使用鼠标点击对Chart控件实现数据提示效果

    2023-03-05 14:20:06
  • asp之家 软件编程 m.aspxhome.com