synchronized锁膨胀过程

news2025/1/10 1:31:56

轻量级锁:

使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以 使用轻量级锁来优化。

轻量级锁原理

1.创建锁记录(Lock Record)对象,每个线程都的栈帧都会包含一个锁记录的结构,内部可以存储锁定对象的 Mark Word

2.让锁记录中 Object reference 指向锁对象,并尝试用 cas 替换 Object 的 Mark Word,将 Mark Word 的值存入锁记录

3. 如果 cas 替换成功,对象头中存储了 锁记录地址和状态 00 ,表示由该线程给对象加锁,这时图示如下

4.如果 cas 失败,有两种情况

a.如果是其它线程已经持有了该 Object 的轻量级锁,这时表明有竞争,进入锁膨胀过程

b.如果是自己执行了 synchronized 锁重入,那么再添加一条 Lock Record 作为重入的计数

当退出 synchronized 代码块(解锁时)如果有取值为 null 的锁记录,表示有重入,这时重置锁记录,表示重 入计数减一

当退出 synchronized 代码块(解锁时)锁记录的值不为 null,这时使用 cas 将 Mark Word 的值恢复给对象头

a.成功,则解锁成功

b.失败,说明轻量级锁进行了锁膨胀或已经升级为重量级锁,进入重量级锁解锁流程

锁膨胀

锁膨胀原理

如果在尝试加轻量级锁的过程中,CAS 操作无法成功,这时一种情况就是有其它线程为此对象加上了轻量级锁(有 竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁。

static Object obj = new Object();
public static void method1() {
 synchronized( obj ) {
 // 同步块
 }
}

当 Thread-1 进行轻量级加锁时,Thread-0 已经对该对象加了轻量级锁

这时 Thread-1 加轻量级锁失败,进入锁膨胀流程

即为Object 对象申请 Monitor 锁,让 Object 指向重量级锁地址

然后自己进入 Monitor 的 EntryList BLOCKED

当 Thread-0 退出同步块解锁时,使用 cas 将 Mark Word 的值恢复给对象头,失败。这时会进入重量级解锁 流程,即按照 Monitor 地址找到 Monitor 对象,设置 Owner 为 null,唤醒 EntryList 中 BLOCKED 线程

重量级锁:每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针

偏向锁

轻量锁缺陷:

轻量级锁在没有竞争时(就自己这个线程),每次重入仍然需要执行 CAS 操作。

轻量锁优化

static final Object obj = new Object();
public static void m1() {
 synchronized( obj ) {
 // 同步块 A
 m2();
 }
}
public static void m2() {
 synchronized( obj ) {
 // 同步块 B
 m3();
 }
}
public static void m3() {
 synchronized( obj ) {
 // 同步块 C
 }
}

Java 6 中引入了偏向锁来做进一步优化:只有第一次使用 CAS 将线程 ID 设置到对象的 Mark Word 头,之后发现 这个线程 ID 是自己的就表示没有竞争,不用重新 CAS。以后只要不发生竞争,这个对象就归该线程所有。如下图所示。(偏向第一个获得锁的线程,并把这个线程存储在对象头里,之后只要是该线程来获取锁,都能快速批准)

 摘自哔哩哔哩黑马程序员笔记

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

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

相关文章

IF:9.0+期刊被踢除,11月SCI/SSCI期刊目录已更新!

【SciencePub学术】2023年11月20日,科睿唯安更新了Web of Science核心期刊目录。 继上次SCI期刊目录和SSCI期刊目录更新之后,本次11月更新共有5本期刊发生变动: • SCIE:有5本期刊不再被SCIE期刊目录收录,1本SCIE期刊更…

infercnv 三回首:深入理解infercnv为何能发nature

大家好,不知你是否还记得,前两次关于infercnv的介绍。请看这里: 肿瘤单细胞转录组拷贝数分析结果解读和应用 单细胞拷贝数变异 infercnv再回首 如果下载了示例数据,并且你已经跑了上述代码,不难得到这张图&#xff1…

海外服务器相较于国内服务器有何特点?亚马逊海外服务器为何零跑全球

随着数字时代的迅猛发展,云计算基础设施的重要性愈发凸显。在这个信息爆炸的全球化时代,很多企业的海外业务的成功往往取决于是否拥有安全、可靠、高性能、可扩展、灵活且全球覆盖的云基础设施,因此对很多企业来说,选择一款优质的…

基于STM32设计的(无人)智慧超市-2023改进版

改进的内容: 增加了一个智慧超市登录入口,整个上位机只有一个APP文件。 可以选择顾客或者管理员的身份进去。优化了界面的显示。 一、项目背景 智慧超市是一种新型的零售形式,它将人工智能、物联网、云计算等技术应用到超市运营中,为消费者提供更加便捷、快捷、个性化的购…

X2Keyarch迁移工具实战 | 将CentOS高效迁移至浪潮云峦操作系统KeyarchOS

X2Keyarch迁移工具实战 | 将CentOS高效迁移至浪潮云峦操作系统KeyarchOS 1. 搭建仿真线上业务环境2. 安装KeyarchOS操作系统和X2Keyarch迁移工具3. 将CentOS系统业务迁移至KeyarchOS系统 浪潮信息云峦操作系统KeyarchOS基于Linux Kernel、OpenAnolis等开源技术自主研发的一款服…

Java Enumeration 接口

Java Enumeration 接口 这段代码展示了如何使用 Enumeration 接口来遍历 Properties 对象的键。在这里,foo.getProp() 返回一个 Properties 对象,而 propertyNames() 方法返回一个 Enumeration 对象,它包含了 Properties 对象中所有键的枚举。…

shell编脚本概述和变量解释

shell的基本概述和规范 shell面向的对象 面向过程语言 (开发的时候,需要一步一步的执行) 做一件事情,排出个步骤,第一步干什么,第二步干什么,如果出现情况A,做什么处理&#xff0…

力扣每日一题-美化数组的最少删除数-2023.11.21

力扣每日一题:美化数组的最少删除数 开篇 今天的力扣每日一题居然写出来了,好开心,迫不及待地把题目分享出来,希望你也能把它狠狠拿下。 题目链接: 2216.美化数组的最少删除数 题目描述 代码思路 创建一个list集合来保存数组&a…

【机器学习】036_权重衰退

一、范数 定义:向量的范数表示一个向量有多大(分量的大小) L1范数: 即向量元素绝对值之和,用符号 ‖ v ‖ 1 表示。 公式: L2范数: 即向量的模,向量各元素绝对值的平方之和再…

对一个Series序列内的元素逐个扩展同一聚合操作一个序列中共有m个元素,从指定的第n个元素开始,对前i元素进行聚合计算Series.expanding()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 一个序列中共有m个元素 从指定的第n个元素开始 对前i元素进行聚合计算 其中&#xff1a;n < i < m 聚合计算&#xff1a;求最大、平均值等 Series.expanding(n).max() Series.expanding(…

重磅,瑞士药监局 发布 EU GMP附录1《无菌药品生产》官方解读!

近日&#xff0c;瑞士药监局发布了EU GMP附录1《无菌药品生产》&#xff08;同时也是PIC/S和WHO GMP附录1&#xff09;的解读文件&#xff0c;该文件侧重于新版EU、PIC/S和WHO GMP附录1的一些最重要的变化&#xff0c;也涵盖了长期以来反复引起问题的方面。反映了检查员对这些主…

HALCON中的运算符和控制流算子

HALCON中的运算符 Haclon中的运算符包括算术运算符、逻辑运算符、关系运算符&#xff0c;其功能和用法与C语言相类似。但HALCON中每个运算符都有一个算子相对应&#xff0c;如表2-2所示。 HALCON中的控制流算子 HALCON通过控制流算子来控制程序的走向&#xff0c;包括条件选…

MQTT协议消息代理服务远程连接

目录 1. Linux 搭建 Mosquitto 2. Linux 安装Cpolar 3. 创建MQTT服务公网连接地址 4. 客户端远程连接MQTT服务 5. 代码调用MQTT服务 6. 固定连接TCP公网地址 7. 固定地址连接测试 Mosquitto是一个开源的消息代理&#xff0c;它实现了MQTT协议版本3.1和3.1.1。它可以在不…

在浏览器中使用WebRTC获取用户IP地址

本文翻译自 Discover WebRTC: Obtain User IP Addresses in the Browser&#xff0c;作者&#xff1a;Zack&#xff0c; 略有删改。 如果需要在程序中获取当前用户的IP&#xff0c;通常手段都是需要使用服务器。但现在借助WebRTC的强大功能&#xff0c;我们可以直接在浏览器客户…

你知道如何实现游戏中的透视效果吗?

引言 游戏中的透视效果可以合理运用CtrlCV实现。 不知道大家有没有这样一段经历&#xff1a;在做Cocos项目时需要一些特定的Shader去做一些特定的效果&#xff0c;例如透视、高光、滤镜等等&#xff0c;想自己写吧&#xff0c;不怎么会啊&#xff0c;网上又找不到&#xff0c…

Gensim库——文本处理和主题建模的强大工具

在信息时代&#xff0c;海量的文本数据不断地涌现。如何从这如山如海的文本中提取有意义的信息&#xff0c;成为了一项关键任务。Python语言提供了许多优秀的库和工具来处理文本数据&#xff0c;其中一款备受推崇的工具就是Gensim库。Gensim是一个开源的Python库&#xff0c;它…

ESP32 MicroPython AI摄像头应用⑩

ESP32 MicroPython AI摄像头应用⑩ 1、AI摄像头应用2、移动检测&#xff08;LCD显示&#xff09;3、实验内容3、参考代码4、实验结果 1、AI摄像头应用 我们小车MCU支持AI(人工智能)加速&#xff0c;可以用于加速神经网络计算和信号处理等工作的向量指令 (vector instructions)…

Haclon简介及数据类型

Haclon简介 HALCON是由德国MVtec公司开发的机器视觉算法包&#xff0c;它由一千多个各自独立的函数&#xff08;算子&#xff09;构成&#xff0c;其中除了包含各类滤波、色彩以及几何、数学转换、形态学计算分析、图像校正&#xff0c;目标分类辨识、形状搜寻等基本的图像处理…

【SEO学习】专家优化

创建、编辑和推广独特的高质量内容既困难又耗时。如果你真的认真对待搜索引擎优化&#xff0c;但却没有取得预期效果&#xff0c;那么最好聘请一位搜索引擎优化专家。 搜索引擎优化专家会执行以下任务&#xff1a; 代码验证和清理 - 确保代码对搜索引擎友好并符合标准。网站结…

CentOS7安装Docker遇到的问题笔记

笔记/朱季谦 以下是笔者本人学习搭建docker过程当中记录的一些实践笔记&#xff0c;过程当中也遇到了一些坑&#xff0c;但都解决了&#xff0c;就此记录&#xff0c;留作以后再次搭建时可以直接参考。 一、首先&#xff0c;先检查CentOS版本&#xff0c;保证在CentOS7版本以…