`

Java自旋锁

    博客分类:
  • Java
 
阅读更多

“自旋”的语义类似“空转”,也就是啥也没干。

 

在某些场景中,基于乐观的假设“稍等,很快就能拿到锁”,JVM 可以让获取锁失败的线程先等着,而不是直接被阻塞挂起。

这个等的过程就是“自旋”。这种获取锁的方式就是“自旋锁”。

 

JVM 让线程“自旋”的方法就是执行几个空循环。

  • 这个“自旋”操作会持续多久?
    • JVM 会根据运行时环境判断最长执行多久
  • 如果在自旋过程中,线程获得了锁,那么线程将停止自旋,进入临界区
  • 如果超过最长允许的自旋时间还未取得锁,目标线程会真的被挂起——操作系统层面上的挂起

自旋锁的性能

为什么会需要自旋锁。

  • 因为如果没有自旋锁,线程获取锁失败时是直接被挂起,将CPU等计算资源让给其它线程;
  • 等到锁可用时,该线程又被唤醒,把计算资源重新分配给它。
  • 这是一个比较耗资源的线程切换。
  • 可以粗略地比较线程自旋空转浪费的性能与切换线程的所耗费的性能,得出某些情况下自旋锁方案的整体性能更好。

 

  • 如果锁竞争不激烈,锁内代码耗时较短,自旋锁等待的时间也会较短,自旋锁就有性能优势。
  • 如果锁竞争激烈,或当期拥有锁的线程需要用该锁消耗较长时间执行同步代码,那么自旋锁的空转浪费的CPU资源可能大于没有自旋锁的方案。

 

自旋锁在单核CPU场景中无效

在单核CPU场景下:

  • 假设线程T1通过自旋锁方式尝试获取线程T2拥有的锁。
  • 因为T1在自旋等待锁时,一直占用了CPU,所以线程T2没有机会执行,T2一直处于挂起状态,也就无法释放锁。
  • 这就导致T1自旋等待期间是永远不可能拿到锁的。
  • 所以自旋锁在单核CPU场景中无效
分享到:
评论

相关推荐

    深入理解java自旋锁

    深入理解Java自旋锁 Java自旋锁是一种锁机制,用于解决多线程之间的变量同步问题。自旋锁的实现是基于CAS(Compare And Swap)算法的,它可以在不使用锁的情况下实现多线程之间的变量同步。 自旋锁的定义是指当一...

    Java轻量级锁(自旋锁)和偏向锁原理

    在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放...

    Java锁之自旋锁详解

    Java中的自旋锁是一种在多线程环境下用于同步和控制并发访问共享资源的机制。它在并发编程中扮演着重要角色,特别是在高并发系统中。自旋锁的基本思想是,当一个线程试图获取锁而该锁已被其他线程持有时,这个线程并...

    Java并发篇乐观锁,悲观锁,自旋锁

    本文主要讨论了四种锁类型:乐观锁、悲观锁、自旋锁以及Java中的synchronized同步锁,并深入解析了synchronized锁的内部机制,包括其核心组件、实现方式以及锁的状态。 1. **乐观锁**:乐观锁假设在多线程环境下,...

    一篇文章轻松搞懂Java中的自旋锁

    自旋锁是Java并发编程中的一种重要机制,用于解决多线程环境下的同步问题。它在高并发场景下能够提高程序的运行效率,避免线程频繁地在内核态和用户态之间切换。本文将深入讲解Java中的自旋锁及其工作原理。 自旋锁...

    自旋锁公平性的三种实现代码下载

    自旋锁是多线程编程中的一个重要概念,用于在共享资源上实现轻量级的同步。自旋锁的原理是当一个线程试图获取已被其他线程持有的锁时,它不会立即阻塞,而是会“自旋”等待,直到锁被释放为止。这样做的好处是可以...

    深入讲解我们说的CAS自旋锁到底是什么

    深入讲解CAS自旋锁的实现机理和原理 CAS(Compare and Swap)是实现自旋锁或乐观锁的核心操作,它的出现是为了解决原子操作的问题。在多线程环境下,原子操作是保证线程安全的重要手段。CAS操作的实现很简单,就是...

    redis实现分布式锁,自旋式加锁,lua原子性解锁

    本文将深入探讨如何使用Redis实现分布式锁,以及如何利用自旋式加锁和Lua脚本实现原子性解锁。 首先,我们来理解分布式锁的基本概念。分布式锁是在多节点之间共享资源时,用于协调各个节点的访问控制机制。在分布式...

    java 中的锁 - 偏向锁、轻量级锁、自旋锁、重量级锁

    java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁

    彻底理解Java中的各种锁.pdf

    本文将详细介绍Java中包括乐观锁、悲观锁、自旋锁、可重入锁、读写锁等多种锁机制的概念、特点、应用场景及其优化技术。 1. 乐观锁与悲观锁 乐观锁与悲观锁反映了对数据并发访问策略的不同预期。乐观锁假设数据通常...

    synchronized锁自旋.docx

    总结来说,`synchronized`锁机制在Java中通过多种方式实现了线程同步,包括自旋锁、自适应自旋锁、轻量锁和偏向锁,这些机制在不同程度上减少了锁的开销,提高了并发性能。在实际编程中,了解这些机制有助于编写出...

    Java 多线程与并发(3-26)-Java 并发 - Java中所有的锁.pdf

    本文主要探讨了Java中的两种广义锁概念——乐观锁和悲观锁,以及自旋锁和适应性自旋锁的区别和应用场景。 1. 乐观锁与悲观锁: 乐观锁认为在读取数据时不会有其他线程修改,因此在读取时不加锁,而在更新数据时检查...

    java 偏向锁、轻量级锁及重量级锁synchronized原理.docx

    总的来说,Java的`synchronized`通过对象头的Mark Word和Monitor对象实现了线程安全的同步机制,同时引入了偏向锁、轻量级锁和自旋锁等优化手段,以平衡性能和线程安全性。理解这些锁的工作原理对于编写高性能的并发...

    Jave 面试 CAS就这?底层与原理与自旋锁

    自旋锁SpinLock唉….刚写完了!别白嫖啊,点赞关注,给你们福利啊~~转载请标注! 好兄弟们,不会真有人看不懂CAS吧?反正我是没看懂… 一. CAS是什么? import java.util.concurrent.atomic.AtomicInteger; /** * 1. CAS...

    java锁各种核心整理

    在Java中,锁的机制主要可以分为乐观锁和悲观锁两大类,此外还包括自旋锁、Synchronized同步锁和可重入锁等,下面将详细介绍这些核心知识点。 乐观锁是一种基于“我认为数据不会经常发生冲突”的假设而设计的锁策略...

    JAVA锁的膨胀过程和优化.docx

    总结来说,Java锁的优化主要通过自旋锁、自适应自旋、锁粗化、锁衰退、偏向锁和轻量级锁等策略来实现。这些策略旨在平衡线程间的竞争与协作,减少不必要的同步开销,提高多线程环境下的程序性能。在实际开发中,理解...

    华为内部招聘面试题

    根据给定文件的信息,我们可以提炼出以下IT领域的关键知识点,主要围绕Java编程语言及Web开发技术,特别是与华为内部招聘面试题相关的知识点进行详细解析。 ### Java基础:对象引用与字符串不可变性 **知识点一:...

    Java中的锁分类与使用.docx

    - 自旋锁是另一种优化策略,线程在获取锁失败时不会立即阻塞,而是循环检测锁是否可用,一旦可用立即获取。在高并发、锁竞争不激烈的情况下,自旋锁能提高效率。 理解这些锁的原理和使用场景是优化并发程序的关键...

    Java高并发实战,锁的优化.docx

    本文主要探讨了Java中的锁优化技术,包括自旋锁、锁消退、锁粗化以及轻量级锁。 自旋锁是一种优化策略,其核心思想是当一个线程在尝试获取锁时,如果锁已经被其他线程持有,它不会立即进入阻塞状态,而是循环等待,...

Global site tag (gtag.js) - Google Analytics