4.6 Monitor概念

news2024/11/27 9:49:23

目录

      • 1、对象头
      • 2、原理Monitor
      • 3、原理之Synchronized
      • 4、原理之Synchronized进阶
        • 1)轻量级锁
        • 2)锁膨胀
        • 3)自旋优化
        • 4)偏向锁
        • 5)锁消除

1、对象头

64 位虚拟机
在加锁的过程中,Mark Word中的62位将会指向操作系统的Monitor对象
在这里插入图片描述

2、原理Monitor

在这里插入图片描述

3、原理之Synchronized

static final Object lock = new Object();
static int counter = 0;

public static void main(String[] args) {
	 synchronized (lock) {
	 	counter++;
	 }
}

从字节码角度来分析synchronize的加锁原理:
(由于字节码文件看不懂,暂时先记着,以后来回顾)
在这里插入图片描述

4、原理之Synchronized进阶

1)轻量级锁

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

demo来进行解释
假设有两个方法同步块,利用同一个对象加锁

    static final Object obj = new Object();
    public static void method1() {
        synchronized( obj ) {
            // 同步块 A
            method2();
        }
    }
    public static void method2() {
        synchronized( obj ) {
            // 同步块 B
        }
    }
  • 创建锁记录(Lock Record)对象,每个线程的栈帧都会包含一个锁记录的结构,内部可以存储锁定对象的Mark Word
    在这里插入图片描述

  • 让锁记录中 Object reference 指向锁对象,并尝试用 cas 替换 Object 的 Mark Word,将 Mark Word 的值存入锁记录
    在这里插入图片描述

  • 如果 cas 替换成功,对象头中存储了 锁记录地址和状态 00 ,表示由该线程给对象加锁,这时图示如下
    在这里插入图片描述

  • 如果 cas 失败,有两种情况

    • 如果是其它线程已经持有了该 Object 的轻量级锁,这时表明有竞争,进入锁膨胀过程
    • 如果是自己执行了 synchronized 锁重入,那么再添加一条 Lock Record 作为重入的计数
      在这里插入图片描述
  • 当退出 synchronized 代码块(解锁时)如果有取值为 null 的锁记录,表示有重入,这时重置锁记录,表示重入计数减一
    在这里插入图片描述

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

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

2)锁膨胀

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

  • 当 Thread-1 进行轻量级加锁时,Thread-0 已经对该对象加了轻量级锁
    在这里插入图片描述
  • 这时 Thread-1 加轻量级锁失败,进入锁膨胀流程
    • 即为 Object 对象申请 Monitor 锁,让 Object 指向重量级锁地址
    • 然后线程1自己进入 Monitor 的 EntryList BLOCKED
      在这里插入图片描述
  • 当 Thread-0 退出同步块解锁时,使用 cas 将 Mark Word 的值恢复给对象头,失败。这时会进入重量级解锁流程,即按照 Monitor 地址找到 Monitor 对象,设置 Owner 为 null,唤醒 EntryList 中 BLOCKED 线程
    在这里插入图片描述

3)自旋优化

重量级锁竞争的时候,还可以使用自旋来进行优化,如果当前线程自旋成功(即这时候持锁线程已经退出了同步块,释放了锁),这时当前线程就可以避免阻塞

自旋重试成功的情况
在这里插入图片描述
自旋重试失败的情况
在这里插入图片描述
在这里插入图片描述

4)偏向锁

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

Java 6 中引入了偏向锁来做进一步优化:只有第一次使用 CAS 将线程 ID 设置到对象的 Mark Word 头,之后发现这个线程 ID 是自己的就表示没有竞争,不用重新 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
        }
    }

在这里插入图片描述

偏向状态
回忆一下对象头格式:
在这里插入图片描述
现在已经不想看了,稍后会总结

撤销-调用对象的hashCode

5)锁消除

JIT即时编译器会对java字节码文件进行进一步优化,例如在不需要加锁的地方会进行一个锁消除的优化
例如: 局部变量没有逃离方法作用域

public void b() throws Exception {
	 Object o = new Object();
	 synchronized (o) {
		 x++;
	 }
 }

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

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

相关文章

外包呆了5年终上岸,劝各位别去了...

有些测试员朋友找工作过程中问我,或者网上问有外包公司的offer,要不要去外包公司?在这里我结合我自己的经历和身边一些朋友的情况来谈谈这个问题。首先我呆过两家外包公司,并且身边有不少朋友是在外包公司工作。所以我只是尽量客观的分析这个…

Python 接口自动化测试导入接口无法上传文件有什么原因? 详细教程

在Python接口自动化测试中,上传文件通常需要使用requests库来发送HTTP请求。以下是一个示例代码来实现上传文件的功能: 如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站百万播放全网第一的自动化测试教程&am…

畅聊趣坊项目测试报告

文章目录 项目背景项目功能测试计划与设计功能测试自动化测试 测试结果功能测试结果UI自动化测试结果 项目背景 在浏览网站时,发现好多网站开放出聊天的窗口,我们一发送消息就会收到一条消息,好奇这个功能是怎么实现的,最后查阅资…

七日杀EOS错误,开服出现房间无法被搜索的问题

如题,本问题建立在你的服务器已经正常启动的情况下。 如果你的服务器根本做不到正常启动,那么这个方案可能并不适合你。 这里只提供windows端的配套过程,如果你的os是linux,那么需要自行bing一下证书导入方法。 本文默认你的serve…

Numpy---类型修改、去重、级联、拆分、拷贝复制

1. 类型修改 ndarray.astype(type) 返回修改了类型之后的数组 stock_change np.random.normal(0, 1, (4, 5)) stock_change.astype(np.int32)ndarray.tostring([order]) ndarray.tobytes([order]) 构造包含数组中原始数据字节的Python字节 arr np.array([[[1, 2, 3], […

【C++学习】特殊类设计 | 类型转换

🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! 特殊类设计 | 类型转换 一、特殊类设计1.1 不能被拷贝的类1.2 只能在堆上创建的类1.3 只能在栈上创建…

SpringBoot整合ShardingSphere5.x实现数据加解密功能

环境&#xff1a;Springboot2.6.14 ShardingSphere5.3.0 准备环境 添加依赖 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>${shardingsphere.version}</ve…

【数据分享】1929-2022年全球站点的逐日最低气温(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01; 之前我们分享过1929-2022年全球气象站…

【资料分享】过压保护自锁控制电路

概述(电路类别、实现主要功能描述)&#xff1a; 在电源系统中&#xff0c;当反馈回路失效时&#xff0c;输出电压不受控&#xff0c;电压升高超出规定范围&#xff0c;此时过高的输出电压有可能造成后续电器设备的损坏。为解决这问题&#xff0c;通常在电源中增加过压保护电路…

神经网络学习率指数衰减ExponentialDecay策略的参数含义与使用方法详解

本文介绍在tensorflow库中&#xff0c;用于动态调整神经网络的学习率的一种方法——指数衰减ExponentialDecay()策略的参数含义及其具体用法。 在进行神经网络训练时&#xff0c;我们经常需要用到动态变化的学习率&#xff0c;其中指数衰减ExponentialDecay()策略是我们常用的一…

【鲁棒优化】具有可再生能源和储能的区域微电网的最优运行:针对不确定性的鲁棒性和非预测性解决方案(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Python 类方法和静态方法】零基础也能轻松掌握的学习路线与参考资料

一、Python类方法和静态方法的概念 在Python中&#xff0c;类方法和静态方法是常见的两种方法。两者都是Python中的函数&#xff0c;可以在类和实例上调用。但是&#xff0c;它们的作用和用法有所不同。 类方法是绑定到类而不是实例的方法&#xff0c;它们可以在实例和类上运…

高性能软件负载OpenResty常用命令

目录 1 案例介绍2 中小公司的详情页方案2.1 缺点 3 大型公司的商品详情页的核心思想3.1 生成静态页3.2 推送到文件服务器3.3 布隆过滤器过滤请求3.4 lua直连Redis读取数据3.5 OpenResty 渲染数据 4 环境准备4.1 配置文件服务器4.2 配置资源反向代理4.3 访问测试 1 案例介绍 商品…

【Unity100个实用小技巧】Git报错:error: some local refs could not be updated;

☀️博客主页&#xff1a;CSDN博客主页 &#x1f4a8;本文由 我是小狼君 原创&#xff0c;首发于 CSDN&#x1f4a2; &#x1f525;学习专栏推荐&#xff1a;面试汇总 ❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏 ⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&…

SpringBoot+Mybatis+Thymeleaf实现的疫情防控物资管理系统

本系统具体使用的技术是&#xff1a;后端使用SpringBootMybatis&#xff0c;前端使用了Thymeleaf框架&#xff0c;数据库使用的是MySql 8.0。开发工具使用的是IDEA。 本系统前端是使用了前辈的管理系统模板&#xff0c;具体的系统模块功能如下图所示&#xff1a; 一、系统首页…

《环信开发者技术等级考试》有奖问答正在进行中。。。

欢迎参加《环信开发者技术等级考试》&#xff0c;希望大家凝神静气&#xff0c;考出水平。 值此环信十周年&#xff0c;参与本次考试所有考生均可凭实力获得周年大礼包。 考场设置 本次考试主要考察大家对集成环信IM以及环信开通服务的熟悉度。 题型包含单选和多选&#xff…

算法修炼之筑基篇——筑基一层初期(解决01背包问题)

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法修炼之练气篇​​​​​ ✨博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;学习了算法修炼之练气篇想必各位蒟蒻们的基础已经非常的扎实了&#xff0c;下来我们进阶到算法修炼之筑基篇的学习。筑基期和练气期…

物联网网关,原来是这么回事,感谢!

《高并发系统实战派》-- 你值得拥有 文章目录 物联网网关是什么&#xff1f;为什么要搞物联网网关&#xff1f;物联网网关作用&#xff1f; 物联网网关技术原理物联网网关实战开发边缘计算与物联网网关的碰撞边缘计算的理解物联网网关结合边缘计算 物联网网关是什么&#xff1f…

Windows10下docker安装及遇到的问题并且在docker快速部署onlyoffice

docker安装官网地址 docker安装超链接点击进入下载 这里下载的是window版的docker&#xff0c;你们根据自身实际情况下载&#xff1b; 安装docker遇到的问题: 第一个问题 : 启动遇到Docker Desktop is unable to detect a Hypervisor 虚拟化技术没打开&#xff0c;需要打开…

有哪些你觉得非常好用的软件?

以下是我认为非常好用的软件&#xff1a; 1. 金鸣表格文字识别&#xff1a;由深圳市金鸣科技有限公司开发&#xff0c;系统采用超前AI&#xff0c;经深度学习&#xff0c;识别精准&#xff0c;可将图片、PDF等转为excel、word&#xff0c;同时支持证件、票据等批量合并转为结构…