JVM如何执行synchronized修饰的方法

这篇具有很好参考价值的文章主要介绍了JVM如何执行synchronized修饰的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先市面上关于synchronized的资料已经很多了,但是大家对于底层的原理实现可能没有什么概念,大多都是死记硬背,所以我想通过实战的方式给大家带来一些不一样的体验。具体体现在哪些方面呢?

  1. 更系统。市面上目前虽然资料众多,但都是零散的。有些资料讲得东西甚至是相互冲突的,都不知道信谁的。我准备从Java层面到JVM层面到操作系统层面系统的去分析用synchronized后呈现的每个现象背后的本质。synchronized很多知识点市面上是没有资料讲的,我给它补上。

  2. 更接近真相。市面上的很多资料,有的是基于字节码解释器那块的代码yy出来的,有的是东拼西凑整合出来的,各个说的都像真的一样,把看的人搞蒙圈了。我准备从模板解释器代码入手,单步调试着研究,有些不确定的自己写代码去证明,争取分享给大家的都是本来如此的知识。不确定的地方我会标注出来。

  1. 授人以鱼不如授人以渔。我会以大家学完后能够手写出synchronized的标准来设计这个专栏。因为从我自己研究的角度来说,抛开语言的障碍,synchronized的每种机制如果让你实现你手足无措,那你还是没有真正地理解synchronized。言外之意就是你不一定要去手写,但是你在脑海中回想,比如CAS、锁膨胀、锁对象加锁解锁……你大概知道代码是怎么写的。

本篇文章是第一篇,聚焦分析JVM是如何执行synchronized修饰的方法的:

  1. 编译系统是如何处理synchronized关键字的

  2. JVM是如何选出锁定的对象的

  3. 模板解释器为了提升效率做了什么

  4. 什么情况会由执行例程切入C++代码

  5. 如何单步调试synchronized

01  方法入口点

JVM执行Java方法都需要先构建运行环境,再去执行字节码指令。

这个运行环境包括:创建栈帧、从调用者堆栈拷贝参数、给this指针赋值…如果是synchronized修饰的方法,还需要:根据是否是静态方法来计算出锁对象,即是当前对象实例还是Class对象、进行上锁…

JVM如何执行synchronized修饰的方法,synchronized,jvm,Java,c++

因为调用每个方法都需要构建运行环境,都需要做这些事情,所以JVM把这套流程打包,封装成一个一个的执行流程。在JVM术语中,一般字节码指令的处理逻辑称为执行例程,这里为了做区分,起了个新的名字,叫entry point,翻译过来就是入口点。

JVM中有很多entry point,都存储在entry table中。与方法调用相关的比较常见的是这四个。非native方法一般对应的就是前两个入口点,被synchronized修饰对应的是zerolocals_synchronized,否则是zerolocals。

JVM如何执行synchronized修饰的方法,synchronized,jvm,Java,c++

这些entry point是什么时候生成的呢?JVM启动的时候,看代码

JVM如何执行synchronized修饰的方法,synchronized,jvm,Java,c++

那Java中的每个方法,何时与这些入口点进行绑定的呢?在链接阶段。看代码

JVM如何执行synchronized修饰的方法,synchronized,jvm,Java,c++

好像没看到synchronized修饰的方法的入口点是如何绑定的对吧。这个得追entry_for_method代码逻辑

JVM如何执行synchronized修饰的方法,synchronized,jvm,Java,c++

02   如何执行

JVM是如何执行synchronized修饰的方法的呢?这个得从编译阶段、链接阶段、运行阶段三个阶段来分析。任何语言的任何语法糖都是由编译系统与运行系统配合完成的。这三个阶段中,编译阶段是编译系统做的事情,链接阶段与运行阶段是运行系统做的事情。接下来展开来说下。

编译系统

JVM在运行时是如何知道我现在要执行的方法有没有被synchronized修饰呢?是通过方法的访问权限为来识别的。

JVM如何执行synchronized修饰的方法,synchronized,jvm,Java,c++

这个数据是在编译阶段生成的,通过IDEA插件jclasslib可查看。

运行系统

如果是synchronized代码块,那在链接阶段会把这个方法当成普通的方法来处理,绑定的执行流就是zerolocals,最终处理synchronized逻辑是在执行monitorenter指令时。

如果是synchronized修饰方法,在链接阶段绑定执行流zerolocals_synchronized。这两者的区别是什么呢?其实生成的执行流是同一套代码,区别就是有个判断,如果是synchronized修饰的方法,会执行lock_method。看代码。

JVM如何执行synchronized修饰的方法,synchronized,jvm,Java,c++

lock_method方法的逻辑是汇编风格写出来的,不太好理解,我就用伪代码解释下

JVM如何执行synchronized修饰的方法,synchronized,jvm,Java,c++

至此,JVM是如何执行synchronized修饰的方法的逻辑就讲完了。当然,synchronized还有很多很多内容,我会逐步分享给大家。感兴趣的小伙伴可以关注一波。我的公众号:硬核子牙。

最后

我知道小伙伴们心理在想什么:我什么时候也能像子牙老师这样,哪里不懂就直接深入源码去寻找答案、工作腻了,我也想写一些自己感兴趣的算法……

实话实话,底层这玩意学起来确实难。有时候遇到问老师就是红手题都找不到答案,甚至有时候百度都不知道怎么查…自己瞎学瞎报班,浪费钱浪费时间,还没有结果。操作系统内核我也是报班学的,自己学了一段时间,真心学不会。我的老师就是红手指的首席科学家唐老师,前瑞星杀毒的技术专家,虚拟化领域的TOP级人物。

给大家看看我之前写的一些项目,证明下我不是在吹牛。如果对手写JVM和linux实战课程感兴趣的话欢迎来咨询学习

JVM如何执行synchronized修饰的方法,synchronized,jvm,Java,c++

JVM如何执行synchronized修饰的方法,synchronized,jvm,Java,c++

JVM如何执行synchronized修饰的方法,synchronized,jvm,Java,c++JVM如何执行synchronized修饰的方法,synchronized,jvm,Java,c++文章来源地址https://www.toymoban.com/news/detail-794874.html

到了这里,关于JVM如何执行synchronized修饰的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入探讨Java虚拟机(JVM):执行流程、内存管理和垃圾回收机制

    目录 什么是JVM? JVM 执行流程 JVM 运行时数据区 堆(线程共享) Java虚拟机栈(线程私有) 什么是线程私有? 程序计数器(线程私有) 方法区(线程共享) JDK 1.8 元空间的变化 运行时常量池 内存布局中的异常问题 1.  Java堆溢出 2.  虚拟机栈和本地方法栈溢出 JVM 类加载 1.

    2024年02月09日
    浏览(48)
  • 【Java可执行命令】(十七)JVM运行时信息动态维护工具 jinfo:一个维护 JVM 相关的配置参数和系统属性的工具,辅助故障排除、诊断和优化 ~

    jinfo 是 Java Development Kit (JDK) 自带的一款命令行工具。它旨在为用户提供进程的运行时信息,特别是与 Java 虚拟机 (JVM) 相关的配置和系统属性。 jinfo 使得用户可以轻松地查看和修改正在运行的 Java 进程的参数,以便进行 故障排除、诊断和优化 。 jinfo 允许用户动态查询和修改

    2024年02月13日
    浏览(51)
  • Java JVM 堆、栈、方法区详解

    目录 1. 栈 2. 堆 3. 方法区 4. 本地方法栈 5. 程序计数器 首先来看一下JVM运行时数据区有哪些。 在介绍JVM栈之前,先了解一下  栈帧  概念。 栈帧:一个栈帧随着一个方法的调用开始而创建,这个方法调用完成而销毁。栈帧内存放者方法中的局部变量,操作数栈等数据。 Jav

    2024年01月19日
    浏览(49)
  • 【JVM】JVM之执行引擎

    本文我们将讲解JVM中的执行引擎。 问题:我们平时所写的Java程序是如何将其进行编译并转换为计算机能够识别的机器码呢?并且Java程序编译和C/C++程序编译有什么区别呢?我们所说的JIT编译器和平时说的编译器有什么区别呢?…我相信在阅读本文过后,你会有一个清楚的认

    2023年04月21日
    浏览(43)
  • 【JVM】JVM执行流程 && JVM类加载 && 垃圾回收机制等

    目录 🌷1、JVM是什么? 🌷2、JVM的执行流程(能够描述数据区5部分) 🌷3、JVM类加载过程 🌷4、双亲委派机制:描述类加载的过程 问题1:类加载器 问题2:什么是双亲委派模型?  问题3:双亲委派模型的优点 🌷5、垃圾回收机制(重要,针对的是堆)    问题1:判定对象

    2024年02月15日
    浏览(59)
  • JVM安全退出(如何优雅的关闭java服务)

    上线!重启!你还在为丢失任务而烦恼么?看这里看这里,从此不再丢任务,JVM可以安全退出的 在交易流程中,为了提升服务的性能,我们做了一些异步化的优化,比如更新用户最近使用的收货地址、提单完成后通过MQ去发送各种通知类消息、清理用户的购物车等等这些操作,

    2024年03月22日
    浏览(46)
  • JAVA HEAP SPACE解决方法和JVM参数设置

    JAVA HEAP SPACE解决方法和JVM参数设置 JAVA HEAP SPACE解决方法和JVM参数设置 原因分析 设置 异常分析 Java堆的管理—垃圾回收提到一下几点,很不错,或许可以作为写程序时候的准则: jvm 内存查看与分析工具 在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的 Heap size 不足2%的时

    2024年02月06日
    浏览(49)
  • JVM零基础到高级实战之Java内存区域本地方法栈

    JVM零基础到高级实战之Java内存区域本地方法栈 JVM零基础到高级实战之Java内存区域本地方法栈 本地方法栈是什么? 用于作用域本地方法执行的一块Java内存区域 为什么要有本地方法栈? 与Java虚拟机栈相同,每个方法在执行的同时都会创建一个栈帧(Stack Framel)用于存储局部

    2024年02月09日
    浏览(42)
  • “深入探究JVM内部机制:如何实现Java程序的运行环境?“

    标题:深入探究JVM内部机制:如何实现Java程序的运行环境? 摘要:本文将深入探究Java虚拟机(JVM)的内部机制,重点讨论JVM如何实现Java程序的运行环境。我们将从JVM的结构、类加载、内存管理、垃圾回收等方面展开讲解,并通过示例代码具体展示JVM内部机制的运作过程。

    2024年02月11日
    浏览(38)
  • JVM的执行引擎

    执行引擎属于 JVM 的下层,包括 解释器、即时编译器、垃圾回收器 ,是Java虚拟机核心的组成部分之一。 用二进制编码方式表示的指令,叫做机器指令码。 用机器码编写的程序一经输入计算机,CPU 直接读取运行,因此和其他语言编的程序相比,执行速度最快。 机器指令与

    2024年02月01日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包