双非本科准备秋招(18.2)—— 图解Monitor

对象头

普通对象

数组对象

        java中对象存储结构分为对象头(Header)、实例数据(Instance Date)和对齐填充(Padding)。

        对象头存储着Mark Word和Klass Word,通过Klass Word,程序才知道这个对象是一个什么对象。

        Mark Word占32位。结构如下,有五种不同的类型,重点记一下:

        01偏向锁、00轻量级锁、10重量级锁

Monitor

        每个java对象都可以关联一个Monitor对象,当用synchronized给对象上锁(重量级)之后,该对象头的MarkWord中就被设置指向Monitor对象的指针

图中流程:

        1、刚开始Monitor中Owner为null

        2、Thread1执行时,将Monitor所有者Owner置为Thread2。

        3、Thread1上锁时,若有其他线程执行synchronized,进入EntryList阻塞blocked

        4、Thread1执行完后,唤醒EntryList中的线程来竞争锁,竞争非公平

        5、Thread0之前获得过锁,但是不满足执行条件,进入等待Waiting状态。

注意:

1、synchronized 必须是进入同一个对象的 monitor 才有上述的效果!

2、不加 synchronized 的对象不会关联监视器,不遵从以上规则!

Synchronized原理

我们可以查看一下synchronized的字节码文件。

把如下代码反编译:

public class Test {static  int cnt = 0;static final Object lock = new Object();public static void main(String[] args) {synchronized (lock){cnt++;}}
}
public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: (0x0009) ACC_PUBLIC, ACC_STATICCode:stack=2, locals=3, args_size=10: getstatic     #2                  // Field lock:Ljava/lang/Object;3: dup4: astore_15: monitorenter6: getstatic     #3                  // Field cnt:I9: iconst_110: iadd11: putstatic     #3                  // Field cnt:I14: aload_115: monitorexit16: goto          2419: astore_220: aload_121: monitorexit22: aload_223: athrow24: returnException table:from    to  target type6    16    19   any19    22    19   any

逐行分析:

         0: getstatic     #2                  // 引用lock对象
         3: dup
         4: astore_1                           // lock引用存到 slot1
         5: monitorenter                    // 将lock对象MarkWord置为Monitor指针
         6: getstatic     #3                  // <- i
         9: iconst_1                           //准备常数 1 
        10: iadd                                 // +1
        11: putstatic     #3                  //  -> i 
        14: aload_1                           // lock引用
        15: monitorexit                       //将lock对象MarkWord重置,唤醒EntryList
        16: goto          24
        19: astore_2                          //e -> slot2
        20: aload_1                           // lock引用
        21: monitorexit                      //将lock对象MarkWord重置,唤醒EntryList
        22: aload_2                           // <- slot 2 (e)
        23: athrow                             //throw e
        24: return

        异常和正常都会正常解锁,不会造成死锁。下面有一个Exception table,当发生异常,会跳转到to指定的位置,保证锁的正常解锁。

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

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

相关文章

cpp智能指针篇(下):深入理解现代cpp中的智能指针shared_ptr、unique_ptr 以及 weak_ptr

目录 写在前面 unique_ptr shared_ptr weak_ptr 智能指针的使用陷阱 致谢 写在前面 上一篇文章同大家深入探讨了auto_ptr。今天给大家带来的是对于 shared_ptr、unique_ptr 以及 weak_ptr 的深入理解&#xff0c;通过测试案例和源码剖析对这三种重要的智能指针的使用方法&…

无心剑小诗《醉爱平凡人生》

醉爱平凡人生 平凡人生&#xff0c;别样卓越 做调色板上最亮的颜料 没有豪华光环与繁杂束缚 只有一份简单的快乐 不追求虚名&#xff0c;不被物欲左右 安静地享受生活&#xff0c;品味每滴雨露 平凡人生&#xff0c;宛如流淌的小溪 没有壮烈激流&#xff0c;却有恒久细流 不…

2024年【G2电站锅炉司炉】模拟试题及G2电站锅炉司炉考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G2电站锅炉司炉模拟试题是安全生产模拟考试一点通生成的&#xff0c;G2电站锅炉司炉证模拟考试题库是根据G2电站锅炉司炉最新版教材汇编出G2电站锅炉司炉仿真模拟考试。2024年【G2电站锅炉司炉】模拟试题及G2电站锅炉…

【数据库】索引的使用

【数据库】索引的使用 前言出发示例创建表Explain 查看sql执行计划where 查询解析无索引有索引 where oderBy 查询解析无索引有索引 总结 前言 在数据库设计过程中&#xff0c;常需要考虑性能&#xff0c;好的设计可以大大提高sql 语句的增删改查速度。在表的创建过程中&…

ywtool inspect命令

一.巡检介绍 日巡检是通过定时任务每天凌晨2点30进行巡检周巡检时通过定时任务每周日的凌晨3点进行巡检日巡检日志文件路径:/usr/local/ywtools/log/daily,每周日凌晨2点会将这一周的日巡检日志进行压缩,压缩路径:/usr/local/ywtools/log/backup/daily周巡检日志文件路径:/usr…

UDP端口探活的那些细节

一 背景 商业客户反馈用categraf的net_response插件配置了udp探测, 遇到报错了&#xff0c;如图 udp是无连接的&#xff0c;无法用建立连接的形式判断端口。 插件最初的设计是需要配置udp的发送字符&#xff0c;并且配置期望返回的字符串&#xff0c; [[instances]] targets…

ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重提示词

论文完成初稿之后&#xff0c;一般情况下&#xff0c;宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易&#xff0c;即使对老师来说&#xff0c;找人评审论文也是一件苦活。我们这个时候可以通过文字提示让 ChatGPT充当我们的评审专家&#xff0c;为论文提出问题…

Spring Boot的打包方式:JAR vs. WAR 打包方式

Spring Boot的打包方式&#xff1a;JAR vs. WAR 打包方式 Spring Boot是一个流行的Java开发框架&#xff0c;提供了快速、便捷的应用程序开发和部署方式。本文将介绍Spring Boot的两种常见打包方式&#xff1a;JAR和WAR。我们将深入探讨它们的特点、适用场景和部署方式&#xf…

常用ES技巧二

文章目录 一、Object.entries()和Object.fromEntries()1.1、Object.entries()1.2、Object.fromEntries() 二、Symbol类型和Symbol属性三、WeakMap和WeakSet四、Promise.allSettled()五、BigInt六、Array.of和Array.from七、.at和.flat八、总结九、最后 一、Object.entries()和O…

政安晨:示例演绎TensorFlow的官方指南(一){基础知识}

为什么要示例演绎&#xff1f; 既然有了官方指南&#xff0c;咱们在官方指南上看看就可以了&#xff0c;为什么还要写示例演绎的文章呢&#xff1f; 其实对于初步了解TensorFlow的小伙伴们而言&#xff0c;示例演绎才是最重要的。 官方文档已经假定了您已经具备了相当合适的…

史上最全嵌入式(学习路线、应用开发、驱动开发、推荐书籍、软硬件基础)

废话不多说直接上思维导图&#xff01; 如果有觉得图片看不清楚的&#xff0c;有疑问的&#xff0c;可在评论区进行留言&#xff01; 群号&#xff1a; 228447240 嵌入式总括 嵌入式书籍推荐 嵌入式软件知识 嵌入式硬件知识 嵌入式应用开发 嵌入式驱动开发 嵌入式视频推荐: 韦…

收到微信发的年终奖。。。

大家好&#xff0c;我是小悟 还剩一天就过除夕了&#xff0c;很多单位都已经放假了&#xff0c;街上的人越来越少&#xff0c;门店关着的很多&#xff0c;说明大家都陆陆续续回自己的家乡过年了。 或许你还在搬砖&#xff0c;坚守节前最后一波工作&#xff0c;或许你正在回家的…