JUC:10.线程、monitor管程、锁对象之间在synchronized加锁的流程(未完)

一、monitor管程工作原理:

首先,synchronized是一个对象锁,当线程运行到某个临界区,这个临界区使用synchronized对对象obj进行了上锁,此时底层发生了什么?

1.当synchronized对obj上锁后,synchronized会与操作系统层面的monitor管程建立连接,也就是在obj的header中构建一个指向monitor的指针。

2.此时线程访问临界区代码,发现Obj锁,所以去查看obj的header中的mark word中指向管程monitor的指针,从而找到monitor。线程会去查看monitor中的owner部分,访问owner,如果owner目前没有线程访问,该线程成为owner去执行临界区代码段。如果存在owner,线程就被放进monitor中的entryset中,相当于等待队列,等待执行完临界区代码段的线程的唤醒。

二、其中线程与obj的交互如下:

线程访问临界区后,会在栈帧中创建obj的指针以及lock record。

lockrecord中记录着 当前锁记录的地址。

然后会与obj进行交互,尝试使用cas将 lock record中的地址+锁状态 与 obj中的mark word交换。

如果交换成功,mark word 中存储的lock状态就会从00转换为01,表示当前的obj为轻量级锁。

现在的lock record中存放着obj 的 地址, 而 obj中也有到线程锁记录的地址。

完整流程:

首先需要明确,轻量级锁不需要访问monitor,因为与操作系统层面的monitor管程建立连接的花销很高。

在线程之间没有因为临界区而交互时,此时挂载的是轻量级锁。流程如下:

首先线程调用任何方法都会将该方法存放在方法区中,并且在线程的栈帧中保存该方法的局部变量、方法参数以及返回地址。

由于该方法有临界区(加锁),此时在线程的栈帧中还会维护锁对象(synchronized是一个对象锁,锁住的对象需要创建对应的索引信息)的地址以及lock record(锁记录)用于存储当前线程的地址。

同时会在栈帧中的额外槽位slot中维护锁对象的header中的mark word(用于释放锁的还原)。

执行CAS 操作:构造一个新的 Mark Word:

  • 低两位改为 01(轻量级锁标志)

  • 高位填入指向自己栈帧 Lock Record 的地址
    然后对对象头做原子 CAS:

  • 成功 → 轻量级锁加锁成功,对象头和 Lock Record 双向链上了;

  • 失败 → 表示有另一个线程同时在抢这个锁,进入自旋重试或锁膨胀(升级到重量级锁)。

解锁的过程只需要再将栈帧中维护的旧对象头替换回对象中即可。

当有其他线程发现锁对象的锁状态不为00,此时就会进行后续处理,比如自旋,自旋失败后,将后续的锁升级为重量级锁。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch(ES)分页

Elasticsearch(简称 ES)本身不适合传统意义上的“深分页”,但提供了多种分页方式,每种适用不同场景。我们来详细讲解: 一、基本分页(from size) 最常用的分页方式,类似 SQL 的 LIM…

原生微信小程序:用 `setData` 正确修改数组中的对象项状态(附实战技巧)

📌 背景介绍 在微信小程序开发中,我们经常需要修改数组中某个对象的某个字段,比如: 列表中的某一项展开/收起多选状态切换数据列表中的临时标记等 一个常见的场景是: lists: [{ show: true }, { show: true }, { s…

Oracle 临时表空间相关操作

一、临时表空间概述 临时表空间(Temporary Tablespace)是Oracle数据库中用于存储临时数据的特殊存储区域,其数据在会话结束或事务提交后自动清除,重启数据库后彻底消失。主要用途包括: 存储排序操作(如OR…

从静态到动态:Web渲染模式的演进和突破

渲染模式有好多种,了解下web的各种渲染模式,对技术选型有很大的参考作用。 一、静态HTML时代 早期(1990 - 1995年)网页开发完全依赖手工编写HTML(HyperText Markup Language)和CSS(层叠样式表…

Flask(六) 数据库操作SQLAlchemy

文章目录 一、准备工作二、最小化可运行示例✅ 补充延迟绑定方式(推荐方式) 三、数据库基本操作(增删改查)1. 插入数据(增)2. 查询数据(查)3. 更新数据(改)4.…

PYTHON从入门到实践7-获取用户输入与while循环

# 【1】获取用户输入 # 【2】python数据类型的转换 input_res input("请输入一个数字\n") if int(input_res) % 10 0:print("你输入的数是10的倍数") else:print("你输入的数不是10的倍数") # 【3】while循环,适合不知道循环多少次…

学习笔记(C++篇)—— Day 8

1.STL简介 STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 2.STL的六大组件 先这样,下一部分是string的内容,内容比较多&a…

ant+Jmeter+jenkins接口自动化,如何实现把执行失败的接口信息单独发邮件?

B站讲的最好的自动化测试教程,工具框架附项目实战一套速通,零基础完全轻松掌握!自动化测试课程、web/app/接口 实现AntJMeterJenkins接口自动化失败接口邮件通知方案 要实现只发送执行失败的接口信息邮件通知,可以通过以下步骤实…

恶意Python包“psslib“实施拼写错误攻击,可强制关闭Windows系统

Socket威胁研究团队发现一个名为psslib的恶意Python包,该软件包伪装成提供密码安全功能,实则会突然关闭Windows系统。这个由化名umaraq的威胁行为者开发的软件包,是对知名密码哈希工具库passlib的拼写错误仿冒(typosquatting&…

云原生灰度方案对比:服务网格灰度(Istio ) 与 K8s Ingress 灰度(Nginx Ingress )

服务网格灰度与 Kubernetes Ingress 灰度是云原生环境下两种主流的灰度发布方案,它们在架构定位、实现方式和适用场景上存在显著差异。以下从多个维度对比分析,并给出选型建议: 一、核心区别对比 维度服务网格灰度(以 Istio 为例…

科技如何影响我们的生活?

科技已成为我们生活中不可或缺的一部分,彻底改变了我们工作、沟通和生活的方式。从智能手机到智能家居,科技已渗透到我们生活的每个角落。无论是用手机闹钟开启新的一天,通过 Alexa 开关灯光,还是打开 Uber 或 Lyft 打车上班&…

Re--攻防世界-基础android

Jadx 可以看到有账号密码输入 进入checkPassword函数 分析一下: 对每个字符 pass[len] 进行以下计算 pass[len] (char) (((255 - len) - 100) - pass[len]); 解密脚本 def decrypt_password(): password [] for len in range(12): c (255 - le…

InnoDB表空间结构-系统表空间

系统表空间整体结构 页号为7的SYS类型页结构

如何构建知识库

构建个人知识库是一个系统化的过程,需要结合工具选择、信息管理和持续优化。以下是分步骤的实用指南,包含现代工具和方法的建议: 一、明确知识库定位(Why) ​核心目标​ 学习型:支持学术研究/职业发展&…

3 大语言模型预训练数据-3.2 数据处理-3.2.2 冗余去除——2.SimHash算法文本去重实战案例:新闻文章去重场景

SimHash算法文本去重实战案例:新闻文章去重场景 一、案例背景与目标二、具体实现步骤与示例1. **待去重文本示例**2. **步骤1:文本预处理与特征提取**3. **步骤2:特征向量化与哈希映射**4. **步骤3:特征向量聚合**5. **步骤4&…

MSPM0G3507之GPIO配置报错 #Sysconfig报错

声明:本文完全免费阅读,如果你发现某天文章被设置了“VIP权限”,请私信我解除(非笔者所为)。 一、问题现象 在打开sysconfig后,GPIO这里会报错。 Unable to render selection Error:launchPadShortcut:Vali…

2025年检测相机十大品牌测评:工业级精度与场景化解决方案解析

一、引言 在工业自动化与智能制造领域,检测相机作为质量管控的核心硬件,正以“高精度、高速度、高适应性”的特性重塑生产流程。这类设备通过光学成像与智能算法结合,实现对工件表面缺陷、尺寸偏差、装配精度的精准检测,效率较传…

Python异步编程深度解析

一、异步编程范式演进 同步阻塞的困境:GIL限制与线程切换开销 事件循环本质:单线程并发模型 协程优势:比线程更轻量的执行单元 IO密集型场景:网络请求/文件操作的最佳实践 二、核心语法精要 import asyncioasync def fetch_…

网络缓冲区

用户态网络缓冲区 网络缓冲区原理为什么需要用户态网络缓冲区Linux下如何接收和发送数据包用户态网络缓冲区设计的本质 网络缓冲区代码实现 网络缓冲区原理 为什么需要用户态网络缓冲区 在网络开发中,我们经常使用到read/write/recv/send等系统调用接口&#xff0…

微信小程序实现简版点赞动画

这是第二次写canvas,基于微信小程序文档demo进行改写 demo效果为方块横向来回循环移动 我想做的是直播间那种点赞效果,竖向曲线移动、方块换成图片、点击添加绘制元素 第一阶段实现竖向曲线移动、点击添加绘制元素;下一阶段讲方块替换为图…