Java对象Object对象头-MarkWord分析-hashCode

代码主要通过打印对象的内存布局来观察对象头在不同状态下的变化,进而分析对象头在不同情况下的内存布局情况。

  1. System.out.println(ClassLayout.parseInstance(o).toPrintable());:这一行代码通过使用开源库 openjdk.jolClassLayout 类来解析对象 o 的内存布局,并将其打印出来。初始时,对象 o 是一个普通的 Object 对象,还没有被锁定。

  2. int hashCode = o.hashCode();:这一行代码调用了对象 ohashCode 方法,生成了哈希码并赋值给 hashCode 变量。

  3. System.out.println(Integer.toBinaryString(hashCode));:这一行代码将生成的哈希码转换为二进制字符串并打印出来。

  4. System.out.println(ClassLayout.parseInstance(o).toPrintable());:这一行代码再次打印对象 o 的内存布局,此时对象 o 的哈希码已经生成,但对象仍处于未锁定状态。

  5. synchronized (o) { System.out.println(ClassLayout.parseInstance(o).toPrintable()); }:这一段代码使用 synchronized 块对对象 o 进行加锁,并打印加锁后对象 o 的内存布局。

根据代码执行的过程和结果,可以得出以下分析:

  • 初始时,对象 o 是一个普通的 Object 对象,其内存布局包括对象头、实例数据和对齐填充。
  • 在调用 hashCode 方法后,对象 o 的哈希码生成并存储在对象头的标记字中,此时对象头的内容发生了变化。
  • 在加锁之前和加锁之后,对象头的锁状态也会发生变化,加锁后会生成锁记录并存储在对象头中,从而导致对象头的内容再次发生变化。

通过观察对象头在不同状态下的变化,可以更加深入地理解 Java 对象在内存中的布局和状态管理机制。

public static void main(String[] args) {Object o = new Object();System.out.println("======原始对象布局======");System.out.println(ClassLayout.parseInstance(o).toPrintable());int hashCode = o.hashCode();System.out.println(Integer.toBinaryString(hashCode));System.out.println("======调用对象hashCode后======");System.out.println(ClassLayout.parseInstance(o).toPrintable());synchronized (o) {System.out.println("======加锁中======");System.out.println(ClassLayout.parseInstance(o).toPrintable());System.out.println("======加锁中======");}System.out.println("======释放锁后======");System.out.println(ClassLayout.parseInstance(o).toPrintable());}

加锁中时,对象头hashCode去哪了

参考:

当Java处在偏向锁、重量级锁状态时,hashcode值存储在哪? - 知乎

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

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

相关文章

备战蓝桥杯---贡献法刷题

话不多说,直接看题: 什么是贡献法?这是一种数学思想,就是看每一个元素对总和的贡献。 1. 我们可以先枚举区间再统计次数,但这显然TLE。我们可以发现,每一个孤独的区间对应一个孤独的牛,因此我…

MySQL 索引底层探索:为什么是B+树?

MySQL 索引底层探索:为什么是B树? 1. 由一个例子总结索引的特点2. 基于哈希表实现的哈希索引3. 高效的查找方式:二分查找4. 基于二分查找思想的二叉查找树5. 升级版的BST树:AVL 树6. 更加符合磁盘特征的B树7. 不断优化的B树&#…

Vulnhub:BOSSPLAYERSCTF: 1

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirmap 命令执行漏洞 反弹shell 提权 系统信息收集 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:2f:dd:9…

移动端WEB开发之响应式布局

一、响应式开发 1.1 响应式开发原理 就是使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备的目的。 1.2 响应式布局容器 响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果。原理就是在不同屏幕下,通过媒体…

Linux安装conda

目录 conda是什么简介conda与miniconda、anaconda的关系 安装下载文件bash安装激活软件检查安装是否成功配置镜像源 创建环境 conda是什么 简介 conda是一个开源的包管理器和环境管理器,用于安装、运行和更新包和它们的依赖项。它可以轻松地在计算机上创建隔离的环…

LeetCode-236. 二叉树的最近公共祖先【树 深度优先搜索 二叉树】

LeetCode-236. 二叉树的最近公共祖先【树 深度优先搜索 二叉树】 题目描述:解题思路一:递归判断解题思路二:0解题思路三:0 题目描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖…

搞学术研究好用免费的学术版ChatGPT网站-学术AI

学术版ChatGPThttps://chat.uaskgpt.com/mobile/?user_sn88&channelcsdn&scenelogin 推荐一个非常适合中国本科硕士博士等学生老师使用的学术版ChatGPT, 对接了超大型学术模型,利用AI技术实现学术润色、中英文翻译,学术纠错&#…

利用AI结合无极低码(免费版)快速实现接口开发教程,会sql即可,不需要编写编译代码

无极低码无代码写服务+AI实践 本次演示最简单的单表无代码增删改查发布服务功能,更复杂的多表操作,安全验证,多接口调用,自自动生成接口服务,生成二开代码,生成调用接口测试,一键生成管理界面多条件检索、修改、删除、查看、通用公共接口调用、通用无限级字典调用等后续…

一、Docker部署GitLab(详细步骤)

Docker部署GitLab(详细步骤) 一、拉取镜像二、启动容器三、修改配置四、修改密码五、浏览器访问 一、拉取镜像 docker安装教程:https://qingsi.blog.csdn.net/article/details/131270071 docker pull gitlab/gitlab-ce:latest二、启动容器 …

通讯录(顺序表)保存数据

在通讯录的基础上加上三个函数实现数据的保存。 分别为录入数据,加入数据与保存数据。 加入数据 先检查通讯录空间是否足够,然后将结构体ab中的数据全部放入通讯录mn中。 注意:字符串的拷贝要使用函数strcpy而不能直接用 加入完成之后将通…

防火墙状态检测和会话机制

FW对TCP,UDP和ICMP协议的报文创建会话

Android java基础_类的继承_android 类继承(2)

运行结果:rootubuntu:/home/topeet/guyilian# javac Ext2.java rootubuntu:/home/topeet/guyilian# java Ext2 10 ustc **子类继承父类的方法和属性都可以进行覆写,我们在子类覆写父类的printInfo方法。**class Person { private int age; public void …