【JUC-锁升级】简要版本

锁升级过程

  • 一、偏向锁
  • 二、轻量级锁
  • 三、重量级锁
  • 四、整体流程

为什么不全部使用Synchronized、Lock等重量级锁呢?

重量级锁底层是基于操作系统的互斥锁实现的,涉及到用户态与内核态之间的切换。

一、偏向锁

如果只有一个线程A频繁的访问某一个共享资源,频繁的对其进行加锁解锁浪费系统资源。

偏向锁顾名思义,如果只有线程A,那么以后线程A访问就不需要获取锁解锁了,直接访问就行。线程判断偏向锁是否偏向自己的依据是,锁对象的MarkWord字段的前52位是否是自己的线程ID。

那假如此时有一个线程B来访问共享资源呢?这时候情况分为两种了:

1、线程A已经访问结束,此时相当于只有线程B,那么锁会偏向于线程B
2、线程A还在访问中,线程B尝试自旋一次,如果失败,锁会升级成轻量级锁,然后B再自旋。

详细流程如下:
在这里插入图片描述
注意 JDK15之后默认关闭了偏向锁,需要自行打开。

二、轻量级锁

轻量级锁主要适用于线程交替执行,没有竞争。
按照上一篇文章中讲到的,轻量级锁的对象头格式大致如下:

[ptr             | 00]  locked             ptr points to real header on stack

mark word 最后两位是 00 00 00,前 62 62 62 位是指向栈帧中Lock Record的指针。

这里解释一下 轻量级锁加锁、解锁过程发生了什么:

1、加锁:

  1. 线程会在自己本地栈空间中创建Lock Record,将其 obj (Object Reference)指向锁对象,表示锁自己占用了
  2. 将锁对象的markword的前 62 62 62 位复制到 Lock Record的Displaced Mark Word字段中,保存原有的锁对象的信息。然后通过CAS尝试将自己的Lock Record地址值放在锁对象的mark word中,如果成功,则修改成功
  3. 如果已经是当前线程持有锁了,那么此次代表一次重入,设置新的Lock Recordobj指向当前锁,Displaced Mark Word字段为null
  4. 如果都失败了,表示锁被其他线程占有了,膨胀为重量级锁。

解锁:

  1. 遍历线程栈,找到所有obj字段等于锁的Lock Record
  2. 如果Lock Record的 Displaced Mark Word为null,说明是一次重入,将obj设置为null后continue
  3. 如果不是null,通过CAS指令将当前Lock Record中的 Displaced Mark Word值赋值给锁的Mark Word字段,如果成功,则continue,否则膨胀为重量级锁。

在这里插入图片描述
轻量级锁的工作流程:
在这里插入图片描述
轻量级锁的自旋是有次数限制的,在JDK6之后,使用了自适应轻量级锁:

  • 如果本次自旋成功,那么失败次数是当前自旋次数 + 1, 即本次成功了有理由认为下次也成功。
  • 如果本次失败了,那么失败次数是当前自旋次数 - 1, 即本次失败了,有理由认为下次也是失败,减少cpu空转。

三、重量级锁

当轻量级锁也解决不了问题的时候,锁会膨胀为重量级锁

锁对象 mark word字段的前62位会放在 互斥量对象的mark word中, 然后指向互斥量对象。

在这里插入图片描述

四、整体流程

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++小碗菜之二:软件单元测试

“没有测试的代码重构不能称之为重构,它仅仅是垃圾代码的到处移动” ——Corey Haines 目录 前言 什么是单元测试? 单元测试的组成 单元测试的命名 单元测试的独立性 Google Test 单元测试的环境配置与使用 1. Ubuntu下安装 Google Test 2. 编写…

家庭财务管理系统的设计与实现ssm小程序+论文源码调试讲解

2系统关键技术 2.1 微信小程序 微信小程序,简称小程序,英文名Mini Program,是一种全新的连接用户与服务的方式,可以快速访问、快速传播,并具有良好的使用体验。 小程序的主要开发语言是JavaScript,它与普…

linux运维命令

防火墙相关命令 防火墙规则查看 firewall-cmd --list-all 禁ping firewall-cmd --permanent --add-rich-rulerule protocol valueicmp drop firewall-cmd --reload 执行完以上命令后,通过firewall-cmd --list-all查看规则生效情况 firewall-cmd --list-all 其…

高通---Camera调试流程及常见问题分析

文章目录 一、概述二、Camera配置的整体流程三、Camera的代码架构图四、Camera数据流的传递五、camera debug FAQ 一、概述 在调试camera过程中,经常会遇到各种状况,本篇文章对camera调试的流程进行梳理。对常见问题的提供一些解题思路。 二、Camera配…

HCIA-openGauss_2_1数据库安装部署

本章导读 openGauss是关系型数据库,采用客户端/服务器,单进程多线程架构,支持单机和一主多备部署方式,备机可读,支持双机高可用和读扩展。 本章详细介绍了安装openGauss的环境和安装部署配置、openGauss数据库的连接…

《Tyche: Stochastic In-Context Learning for Medical Image Segmentation》CVPR2024

摘要 这篇论文介绍了一个名为Tyche的模型,它用于医学图像分割任务。Tyche通过使用上下文集来为以前未见过的任务生成随机预测,无需重新训练。该模型解决了两个主要问题:1) 对于大多数新的分割任务,需要重新训练或微调新模型&…

47 基于单片机的书库环境监测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采用DHT11湿度传感器检测湿度,DS18B20温度传感器检测温度, 采用滑动变阻器连接数模转换器模拟二氧化碳和氧气浓度检测,各项数值通过lc…

NAND闪存行业全面且深入的分析

根据QYResearch调研团队的最新报告“全球NAND闪存市场报告2023-2029”,预计2029年全球NAND闪存市场规模将达到1263亿美元,未来几年年复合增长率(CAGR)为10.0%。这一预测揭示了NAND闪存市场的强劲增长潜力。 一、市场研究与发展趋…

html-两个div,让一个div跟随另外一个div的高度

在开发的过程中遇到有些场景事这样的,两个div的高度不一致,而且都是动态高度,有的时候div1高,有的时候div2高,如果设置flex的话,那么就会把较矮的元素撑大,但是我想始终都以div1的高度作为基准&…

函数方法不占额外存储空间(内存分区)?

上篇博客说到扩展是不会增加存储空间的,且扩展不能扩展存储属性。既然这样,那我们就能理所应当推断出方法是不占存储空间的,为什么呢? 首先,我们要先了解内存的五大分区:栈,堆,静态…

IDEA注释格式、匹配补全调整

1.注释格式调整 目前重新捡起一部分Java,写代码时候发现注释快捷键总是放在第一列,看起来很难受,故寻找方法如下: 分别点击 编辑器-代码样式-Java 修改注释代码选项如下 2.大小写匹配补全问题 还发现在写代码过程中&#xff0c…

抖音矩阵系统快速部署指南/抖音矩阵系统源码分发,短视频矩阵账号管理系统开发部署—

抖音矩阵系统的源码分发与短视频账号管理平台的开发部署,要求通过对接官方API来实现功能的拓展。当前开发的账号矩阵管理系统专注于提供一键式管理多个账户的能力,支持定时发布内容、自动化关键词生成以实现搜索引擎优化(SEO)和霸…

算法笔记:力扣49.字母异位词分组

思路:排序哈希表映射 关键API: char [] arr str.toCharArray(); 将字符串转为字符数组返回。 Arrays.sort(arr); 对数组进行排序; Map.getOrDefault(Object key, V defaultValue): 要查找的键和默认值。如果键存在&#xf…

医疗服务高质量发展项目会议在杭州成功举办

2024年11月30日,医疗服务高质量发展项目会议在杭州成功举办,此次会议旨在探讨医疗服务领域的最新进展和未来趋势,推动医疗服务的高质量发展。来自全国各地的医院管理者、专家学者齐聚一堂,共同分享智慧医疗、绩效考核、精细化管理…

k近邻法基本知识简记

一、原理与概念 1、样本 k近邻法使用的样本数据集合,称作训练样本集,并且样本集中每个数据都存在标签,即样本集中每个数据与所属分类的对应关系已知。 2、原理 输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的…

开源C代码之路:一、Gitee

开源c代码之路:一,Gitee 前言1、开源项目2、从哪里找?3、举个例子4、总结: 本系列回顾清单开源代码示例 前言 从开源开发的角度,由浅入深,一步步初探C语言编程的入门之路。 本篇讲解:Gitee 1…

极化定标未知数,反射对称条件下

把观测到的协方差矩阵都看作方程,则观测方程有16个,对角线四个实数,非对角线六个复数。 未知数有18个 f1 f2 d1 d2 d3 d4是12个 绝对幅度A 1个和绝对相位 θ在协方差中被消去了 协方差矩阵(反射对称性下)有5个未知数…

基于STM32的Wi-Fi无人机项目

引言 随着无人机技术的快速发展,基于微控制器的DIY无人机变得越来越流行。本项目将介绍如何使用STM32微控制器制作一架简单的Wi-Fi无人机。通过本项目,您将了解到无人机的基本组成部分,如何进行硬件连接,代码编写,以及…

【附源码】基于环信鸿蒙IM SDK实现一个聊天Demo

项目背景 本项目基于环信IM 鸿蒙SDK 打造的鸿蒙IM Demo,完全适配HarmonyOS NEXT系统,实现了发送消息,添加好友等基础功能。代码开源,功能简洁,如果您有类似开发需求可以参考。 源码地址:https://github.c…

MicroSIP软电话使用

MicroSIP - 基于 PJSIP 协议栈的开源便携式 SIP 软电话 适用于 Windows 操作系统。 它允许进行高质量的 VoIP 通话(个人对个人或在线 普通电话)。来自 SIP 提供商的云 您可以选择最适合您的,注册帐户并在 MicroSIP 中使用它。 您将获得免费的…