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

2024-02-08 01:04

本文主要是介绍双非本科准备秋招(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指定的位置,保证锁的正常解锁。

这篇关于双非本科准备秋招(18.2)—— 图解Monitor的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/689489

相关文章

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的

图解可观测Metrics, tracing, and logging

最近在看Gophercon大会PPT的时候无意中看到了关于Metrics,Tracing和Logging相关的一篇文章,凑巧这些我基本都接触过,也是去年后半年到现在一直在做和研究的东西。从去年的关于Metrics的goappmonitor,到今年在排查问题时脑洞的基于log全链路(Tracing)追踪系统的设计,正好是对这三个话题的实践。这不禁让我对它们的关系进行思考:Metrics和Loggi

第十章 【后端】环境准备(10.4)——Vagrant

10.4 Vagrant Vagrant 官网 Vagrant 镜像仓库 下载 安装 直接 install。 设置环境变量 Vagrant 默认将镜像保存在用户文件夹的 .vagrant.d 目录下,若用户文件夹在C盘,下载的镜像文件会大量占用C盘空间。设置环境变量 VAGRANT_HOME 后,Vagrant 会将镜像保存到环境变量指定的文件夹下。

OpenStack离线Train版安装系列—2计算节点-环境准备

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack离线Train版安装系列—1控制节点-环境准备

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack镜像制作系列1—环境准备

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录 CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作

我在高职教STM32——准备HAL库工程模板(1)

新学期开学在即,又要给学生上 STM32 嵌入式课程了。这课上了多年了,一直用的都是标准库来开发,已经驾轻就熟了。人就是这样,有了自己熟悉的舒适圈,就很难做出改变,老师上课也是如此,排斥新课和不熟悉的内容。显然,STM32 的开发,HAL 库已是主流,自己其实也在使用,只不过更换库就意味着教学内容有很大变化,自己也就迟迟没有迈出调整这一步。现在,是时候做出变化了,笔者计划保持教学项