首页 > 其他分享 >说一下synchronized的锁的升级和降级

说一下synchronized的锁的升级和降级

时间:2024-10-08 20:21:37浏览次数:11  
标签:降级 synchronized 升级 线程 偏向 重量级 轻量级

在 Java 中,synchronized关键字使用的锁有状态的升级和降级过程,主要涉及偏向锁、轻量级锁和重量级锁。

一、偏向锁(Biased Locking)

  1. 引入目的:

    • 在没有竞争的情况下,减少锁获取的开销。很多情况下,一个对象在被一个线程使用时,不存在多线程竞争,此时使用偏向锁可以避免不必要的同步操作。
  2. 工作原理:

    • 当一个线程首次访问同步块并获取锁时,锁对象会偏向这个线程,将线程 ID 记录在锁对象的头部。
    • 后续这个线程再次进入同步块时,只需要检查锁对象的头部是否记录了自己的线程 ID,如果是,则直接进入同步块,无需进行任何同步操作。

二、轻量级锁(Lightweight Locking)

  1. 升级场景:

    • 当有第二个线程竞争锁时,偏向锁会升级为轻量级锁。
  2. 工作原理(CAS+自旋):

    • 轻量级锁使用 CAS(Compare and Swap)操作来尝试获取锁。线程在自己的栈帧中创建一个锁记录(Lock Record),并将锁对象的 Mark Word 复制到锁记录中。
    • 然后线程尝试使用 CAS 将锁对象的 Mark Word 更新为指向自己的锁记录的指针。如果 CAS 操作成功,线程就获得了锁;如果失败,说明有其他线程在竞争锁,当前线程会进行自旋等待,即不断地尝试获取锁,而不是进入阻塞状态。

三、重量级锁(Heavyweight Locking)

  1. 升级场景:

    • 如果轻量级锁的自旋等待时间过长或者自旋次数超过一定限制,轻量级锁会升级为重量级锁。
  2. 工作原理:

    • 重量级锁会导致线程进入阻塞状态,等待操作系统的调度。当锁被释放时,操作系统会唤醒等待的线程。
    • 重量级锁的开销比较大,因为涉及到线程的阻塞和唤醒,以及操作系统的调度。

四、锁的降级

  1. 情况较少:

    • 锁的降级相对来说比较少见。一般在一些特定的场景下,比如在长时间没有竞争的情况下,可能会从重量级锁降级为轻量级锁或者偏向锁。
  2. 实现困难:

    • 在实际应用中,由于锁的升级过程是自动的,而降级过程相对复杂且不太容易自动触发,通常需要开发者根据具体情况进行特殊的处理和优化。

五、总结

锁的升级和降级过程是 JVM 为了在不同的竞争情况下提高性能而自动进行的调整。在实际开发中,开发者一般不需要直接干预这个过程,但了解这个机制可以帮助我们更好地理解 Java 中多线程同步的性能特点和优化方向。同时,在高并发场景下,合理地使用同步机制和避免过度竞争是提高程序性能的关键。

标签:降级,synchronized,升级,线程,偏向,重量级,轻量级
From: https://blog.csdn.net/challenge51all/article/details/142741951

相关文章

  • synchronized关键字的使用和原理
    在Java中,synchronized关键字是一种用于实现线程同步的机制,它可以确保在同一时刻只有一个线程能够访问被synchronized修饰的代码块或方法。一、作用和原理互斥访问:synchronized关键字通过对共享资源加锁来实现互斥访问。当一个线程进入synchronized代码块或方法时,它会获取......
  • 深入理解 synchronized 的锁升级【转载】
    目录本文转载自:前言锁升级无锁偏向锁轻量级锁重量级锁总要有总结锁优化本文转载自:深入理解synchronized的锁升级-掘金(juejin.cn)前言        最近看到一道有关synchronized关键字的面试题:不同JDK版本对synchronized有何优化?这道面试题的目......
  • 在Windows 10中,您可以使用以下命令来转换系统版本(例如,从家庭版升级到专业版)。主要使用
    在Windows10中,您可以使用以下命令来转换系统版本(例如,从家庭版升级到专业版)。主要使用的是slmgr和DISM工具。以下是相关命令:1. 查看当前版本和激活状态bashCopyCodeslmgr/dli2. 输入新产品密钥bashCopyCodeslmgr/ipk<新产品密钥>请将<新产品密钥>替换为您要升......
  • 记一次升级系统补丁导致 VS2022 崩溃分析
    一:背景1.讲故事在最近一两年内VisualStudio2022会偶发的出现打开即崩溃的情况,本想着把VS卸载重装,但发现这东西想卸载干净还是蛮困难的,又加上我这个人比较懒,所以就直接重装系统了,最近的9月份因为它重装了一次系统,但过了一天又遇到了同样的问题,在这样一个背景下我决定认真的看......
  • 迎接国庆旅游热潮,火山引擎数据飞轮助力景区数智化升级
    随着人们生活水平的提高和旅游消费观念的转变,国庆假期成为人们出行旅游的黄金时段。同程旅行发布的报告显示,北京、杭州、重庆、上海、南京、成都等城市仍是“十一”假期国内热门的目的地,而一些新兴的宝藏旅游目的地如新疆阿勒泰、云南迪庆、山东威海等也被挖掘出来,成为假期旅游......
  • WPF ListBox IsSynchronizedWithCurrentItem True ScrollIntoView via behavior CallM
    <ListBoxGrid.Column="0"ItemContainerStyle="{StaticResourcelbxItemContainerStyle}"ItemsSource="{BindingBooksCollection,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"IsSynchronizedWith......
  • WPF ListBox IsSynchronizedWithCurrentItem="True"
    //xaml<Windowx:Class="WpfApp13.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic......
  • 小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM
    小米13TPro是一款性能卓越、设计精美的旗舰机型,具备多项领先配置,且在与前一代产品及友商机型的对比中优势明显,值得深入探讨。性能提升小米13TPro搭载了最新的天玑9200+处理器,相较于前一代(小米12TPro)的骁龙8+Gen1,在性能和能效表现上均有显著提升。天玑9200+的A......
  • Centos7 停止维护之后 升级gcc||找不到devtoolset-8-gcc* 问题解决方案
    为了去小米澎湃互联组,感觉必须得拿下linux网络编程,今天第一步这个centos就给我拉了坨大的问题实质SCL源没换,相信你也在别的教程上看到要安装centos-release-scl吧?有坑!安装完成后在/etc/yum.repos.d目录下会出现CentOS-SCLo-scl.repo和CentOS-SCLo-scl-rh.repo两个文件,......
  • 升级提示 执行SQL发生错误!错误:duplicate column name: picstitle
    针对PbootCMS升级过程中出现的 duplicatecolumnname:picstitle 错误,可以通过手动执行SQL脚本来解决此问题。以下是详细的步骤和解决方案。问题分析在从PbootCMS3.0.5及以下版本升级到3.0.6版本时,可能会出现 duplicatecolumnname:picstitle 的错误。这通常是......