Synchronized底层机制:偏向锁、轻量级锁与重量级锁及其锁升级过程

前言:

在Java并发编程中,synchronized关键字是用于实现线程同步的重要工具。在JVM中,synchronized的底层实现涉及到了偏向锁、轻量级锁和重量级锁这三种锁状态,以及锁升级过程。在之前的文章中介绍到过,这篇文章详细对锁升级进行说明。

在这里插入图片描述

偏向锁

偏向锁是Java 6中引入的一种优化手段,它的核心思想是:如果一个线程获得了锁,并且没有释放,那么下次当这个线程再次尝试获得这个锁的时候,不需要做任何同步操作,不需要进行CAS操作或者阻塞,可以直接获得这个锁。偏向锁主要是为了避免无竞争情况下的同步原语,进一步提高程序的运行性能。

如何获取偏向锁

当一个线程首次访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储偏向的线程ID。

在后续操作中,如果这个线程再次尝试获得这个锁,JVM只需检查对象头的Mark Word里是否存储着指向当前线程的偏向锁。如果是,就表示线程已经获得了锁,可以继续执行同步代码块。

如何撤销偏向锁

当一个线程释放偏向锁时,JVM并不会立即清除对象头中的偏向线程ID,而是将其设置为一个特殊值,表示该锁已经被释放。这样,当其他线程尝试获取这个锁时,JVM会检测到这个特殊值,从而知道该锁已经被释放,可以重新进行偏向锁的获取操作。
在这里插入图片描述

轻量级锁

轻量级锁是为了减少获得锁和释放锁所带来的性能消耗而引入的。在锁竞争不激烈的情况下,轻量级锁可以提高程序的性能。它的实现主要依赖于自旋和CAS操作。

如何轻量级锁

当线程尝试获取一个被其他线程持有的轻量级锁时,它会进入自旋状态,尝试通过CAS操作获取锁。如果自旋等待超过预定的次数仍然没有成功获得锁,那么该线程将会被挂起,转换为重量级锁。在Java 6之后,对于非偏向锁的同步块,在第一次被访问时也会尝试使用轻量级锁。

如何轻量级锁

轻量级锁的释放过程相对简单。当持有锁的线程释放锁时,只需将对象头中的Mark Word设置为无锁状态即可。这样,其他线程就可以尝试获取这个轻量级锁了。

重量级锁

重量级锁是传统的同步锁实现方式,它在JVM中是通过对象监视器Monitor来实现的。当一个线程尝试获取一个被其他线程持有的重量级锁时,它会被阻塞并放入锁的等待队列中。

当持有锁的线程释放锁时,等待队列中的一个线程会被唤醒并获得锁。这种实现方式虽然保证了线程安全,但是在竞争激烈的情况下会导致大量的线程切换和上下文切换,从而带来较大的性能开销。

锁升级过程

接下来详细介绍一下锁升级的过程,这块也是面试中的重点!

在JVM中,synchronized的底层实现涉及到了偏向锁、轻量级锁和重量级锁这三种锁状态的转换过程,即锁升级过程。

当一个线程首次访问同步块并获得锁时,该锁的状态为偏向锁。

在后续的操作中,如果该线程再次尝试获得这个锁,JVM会检查该锁的状态并进行相应的处理。如果该锁的状态为偏向锁且偏向的线程ID与当前线程的ID相同,则表示该线程已经获得了锁,可以继续执行同步代码块;如果该锁的状态为偏向锁但偏向的线程ID与当前线程的ID不同,则表示该锁已经被其他线程持有,需要进行竞争。

此时,JVM会将该锁的状态升级为轻量级锁或重量级锁,具体取决于竞争的激烈程度。如果竞争不激烈,JVM会尝试使用CAS操作获取轻量级锁;如果竞争激烈或自旋等待超过预定的次数仍然没有成功获得轻量级锁,则将该锁的状态升级为重量级锁并阻塞当前线程放入等待队列中等待唤醒。

当持有锁的线程释放锁时也会根据当前锁的状态进行相应的处理。如果当前锁的状态为重量级则唤醒等待队列中的一个线程并获得锁;如果当前锁的状态为轻量级或偏向则只需将对象头中的Mark Word设置为无锁状态即可。

同时也祝愿各位小伙伴儿在面试的过程中这块知识点答得都对,看完全会!

文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/203517.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《golang设计模式》第三部分·行为型模式-09-策略模式(Strategy)

文章目录 1. 概述1.1 作用1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 1.1 作用 策略(Strategy)是用于封装一组算法中单个算法的对象,这些策略可以相互替换,使得单个算法的变化不影响使用它的客户端。 1.1 …

基于Springboot的房产销售系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的房产销售系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Sp…

Python数据分析从入门到进阶:模型评估和选择(含代码)

引言 之前我们介绍了机器学习的一些基础性工作,介绍了如何对数据进行预处理,接下来我们可以根据这些数据以及我们的研究目标建立模型。那么如何选择合适的模型呢?首先需要对这些模型的效果进行评估。本文介绍如何使用sklearn代码进行模型评估…

《PFL》论文阅读笔记

一、概要 随着联邦学习的发展,简单的聚合算法已经不在有效。但复杂的聚合算法使得联邦学习训练时间出现新的瓶颈。本文提出了并行联邦学习(parallel federated learning,PFL),通过调换中心节点聚合和广播的顺序。本文…

W11安装mysql8详细保姆篇

一、MySQL的下载 目前官方最新版本是8.0.34,考虑到其稳定性、可靠性还需一定周期保证,所以使用官方版求稳定仍然建议5.7系列。MySQL官方下载链接:MySQL官网下载 二、MySQL的安装 1、右击下载完成的安装包 2、点击Custom >> Next 3、…

【LeetCode】每日一题 2023_11_30 确定两个字符串是否接近 (数组、排序、哈希/位运算、脑筋急转弯)

文章目录 刷题前唠嗑题目:确定两个字符串是否接近题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode?启动!!! 刷完今天,我的每日一题就坚持一个月啦,月度勋章要到手啦 今早很尴尬,…

【C++】POCO学习总结(八):通知Notifications和事件Events

【C】郭老二博文之:C目录 1、Notifications和Events的区别 1)通知Notifications:如果观察者不知道或不关心事件的来源,则使用通知Notifications。 Poco::NotificationCenter或Poco::NotificationQueue位于源source和目标target之…

【JS Promise, Promise.all 与 async/await用法详解】

目录 PromisePromise基本使用Promise可进行连续回调Promise回调可接受入参1.工作原理 async/await总结参考文档: 异步 let a 0setTimeout(() > {a 1}, 1000)console.log(a) // 0此时这个延迟就成为异步执行的了,a值还没有变1就被使用输出&#xff0…

BLP9H10-30GZ LDMOS 功率晶体管 Ampleon

BLP9H10-30GZ 30W塑料LDMOS 功率晶体管,适用于频率范围为616 MH 至960 MHz的基站应用。 BLP9H10-30GZ 特点和优势: 高效率 出色的耐用性 专为宽带操作而设计 出色的热稳定性 高功率增益 集成ESD保护 有关 RoHS 合规性 BLP9H10-30GZ应用程序&…

上海震坤行被评为虹桥生产线互联网服务高质量发展平台

上海震坤行被评为虹桥生产线互联网服务高质量发展平台 10月12日,新一期“潮涌浦江投资虹桥”活动暨“战略赋能新机遇,开放引领新高地”——2023虹桥国际中央商务区投资促进大会在上海虹桥举行。 本次活动旨在释放关于推动虹桥国际开放枢纽进一步提升能级…

matplotlib与opencv图像读取与显示的问题

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 最近在用opencv和matplotlib展示图片,但是遇到了一些问题,这里展开说说 首先需要明确的是,opencv和matplotlib读取图片都是通道在最后,而前者默认可见光图像是BGR,后者是RGB.此外还有PIL以及imageio等读取图像的工具…

东明石化集团领导团队参访震坤行工业超市

东明石化集团领导团队参访震坤行工业超市 10月16日,山东东明石化集团(以下简称东明石化)总裁李治先生一行带队来访参观交流震坤行,与震坤行工业超市董事长兼CEO陈龙、销售负责团队开展座谈。期间,双方就企业数字化转型…

图扑软件受邀出席高交会-全球清洁能源创新博览会

“相聚鹏城深圳,共享能源盛宴” 第二十五届中国国际高新技术成果交易会(简称“高交会”)于 11 月 15-18 日在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同…

C#图像处理OpenCV开发指南(CVStar,04)——图片像素访问与多种局部放大效果的实现代码

​​​​​​​ 使用本文代码需要预先设置一点开发环境,请阅读另外一篇博文: C#图像处理OpenCV开发指南(CVStar,03)——基于.NET 6的图像处理桌面程序开发实践第一步https://blog.csdn.net/beijinghorn/article/deta…

ESP32-Web-Server编程- WebSocket 编程

ESP32-Web-Server编程- WebSocket 编程 概述 在前述 ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 中,我们创建了一个基于 HTTP 协议的 ESP32 Web 服务器,每当浏览器向 Web 服务器发送请求,我们将 HTML/CSS 文件提供给浏览器。 使用…

[Linux] linux防火墙

一、防火墙是什么 防火墙(FireWall):隔离功能,工作在网络或主机的边缘,数据包的匹配规则与由一组功能定义的操作组件处理的规则相匹配,根据特定规则检查网络或主机的入口和出口 当要这样做时,基…

EXCEL一对多关系将结果合并到一个单元格

EXCEL一对多关联结果,合并到1个单元格,变成一对一 需求说明 举例说明 假设给出国家省和国家市的对应表,因为每个省都有很多个城市(如图1,截取了部分),属于一对多的情况; 如何将同…

数据清洗和特征工程的关系是什么?有什么区别?

1.数据清洗独立于特征工程 数据清洗是独立于特征工程的:一方面,数据清洗不仅适用于机器学习项目,也适用于一般的数据统计分析过程,而特征工程仅适用于机器学习项目;另一方面,针对机器学习项目,…

小程序云开发中引入vant

首先看一下云开发中的小程序的目录结构 安装 vant 上面是官方的方法 具体到我们的项目是这样子的 最后,构建一下就可以了