JUC并发编程:Monitor和对象结构

news2024/11/15 22:59:39

JUC并发编程:Monitor和对象结构

  • 1. Monitor
    • 1.1 对象的结构
      • 1.1.1 MarkWord
      • 1.1.2 Klass Word
      • 1.1.3 数组长度
      • 1.1.4 🌰

1. Monitor

Monitor官方文档

       我们可以把Monitor理解为一个同步工具,也可以认为是一种同步机制。它通常被描述为一个对象,所有的Java对象都是天生的Monitor,每一个Java对象都有成为Monitor的潜质。因为在Java的设计中 ,每一个Java对象都带了一把看不见的锁,它叫做内部锁或者Monitor锁。

       Monitor 是线程私有的数据结构,每一个线程都有一个可用monitor record列表,同时还有一个全局的可用列表。每一个被锁住的对象都会和一个monitor关联(对象头的MarkWord中的LockWord指向monitor的起始地址),同时monitor中有一个Owner字段存放拥有该锁的线程的唯一标识,表示该锁被这个线程占用。

moniter结构:

       获取对象锁的过程,其实是获取monitor对象的所有权的过程。哪个线程持有了monitor对象,那么哪个线程就获得了锁,获得了锁的对象可以重复的来获取monitor对象,但是同一个线程每获取一次monitor对象所有权锁计数就加一,在解锁的时候也是需要将锁计数减成0才算真的释放了锁。
       monitor对象,我们其实在Java的反编译文件中并没有看到。这个对象是存放在对象头中的。

1.1 对象的结构

       在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。所谓对齐填充是指如果对象总大小不是4字节的整数倍,会填充上一段内存地址使之成为整数倍。

下图所示为64位JVM堆中的Java对象结构:
在这里插入图片描述
对象头在对象的最前端,包含两部分或者三部分:Mark Word、Klass Word,如果对象是一个数组,那么还可能包含第三部分:数组的长度。

1.1.1 MarkWord

       MarkWord主要存储对象运行时的一部分数据,这里面主要包含对象的hashcode、GC年龄分代、synchronized锁信息(锁状态标志位、线程锁标记、偏向线程ID、偏向时间戳)等等。

       MarkWord 在32位和64位虚拟机上的大小分别位32bit 和 64bit,它的最后 2 bit 是锁标志位,用来标记当前对象的状态。

在这里插入图片描述

1.1.2 Klass Word

       里面存的是一个地址,占32位或64位,是一个指向当前对象所属于的类的地址,可以通过这个地址获取到它的元数据信息。klass 包含类的元数据信息,像类的方法,常量池等。你可以把它当作 java 里的 java.lang.Class 对象。

       如果应用的对象过多,使用64位的指针将浪费大量内存。64位的JVM比32位的JVM多耗费50%的内存。 现在使用的64位 JVM会默认使用选项+UseCompressedOops 开启指针压缩,将指针压缩至32位。

1.1.3 数组长度

       如果这个对象是数组类对象,那么如上图右侧所示,会在对象头里额外的添加一个记录数组长度的字段。

以64位操作系统为例,对象头存储内容图例

在这里插入图片描述

  • age:Java GC标记位对象年龄。
  • identity_hashcode:对象标识Hash码,采用延迟加载技术。当对象使用HashCode()计算后,并会将结果写到该对象头中。当对象被锁定时,该值会移动到线程Monitor中。
  • thread:持有偏向锁的线程ID和其他信息。这个线程ID并不是JVM分配的线程ID号,和Java Thread中的ID是两个概念。
  • epoch:偏向时间戳。
  • ptr_to_lock_record:指向栈中锁记录的指针。
  • ptr_to_heavyweight_monitor:指向线程Monitor的指针。

1.1.4 🌰

class Student{
    boolean flag=false;
}
public class Test1 {
    public static void main(String[] args) {
        Student student=new Student();
        System.out.println(ClassLayout.parseInstance(student).toPrintable());
    }
}

在这里插入图片描述

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

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

相关文章

零基础Linux_15(基础IO_文件)软硬链接+动静态库详解

目录 1. 软硬链接 1.1 创建软链接 1.2 创建硬链接 1.3 硬链接数和unlink 2. 动静态库 2.1 制作静态库 2.2 查看和打包静态库 2.3 使用静态库 2.3.1 安装在默认搜索路径 2.3.2 告知路径库路径库名 2.4 制作动态库 2.5 使用动态库 2.5.1 安装在默认搜索路径 2.5.2 …

轻松虚拟gps定位 AnyGo中文 for mac

AnyGo是一款旨在帮助用户模拟和改变iPhone的GPS位置,以实现虚拟定位的功能。该软件适用于iOS设备,并提供了一系列强大的功能,让用户能够自由地模拟不同地理位置,以满足各种需求。 以下是AnyGo可能提供的一些主要功能和特点&#…

设置全局滚动条样式

需求:统一滚动条样式,不需要每次都要在页面一个一个的设置,整个项目只要内容超出了显示滚动条了就会是自己设置的那个滚动条样式显示 1.效果 2. 创建scroll.scss文件 滚动条样式如下,可以自行更改 /* // 滚动条样式重写-chrome …

新闻api接口,新闻资讯,社交媒体,体育赛事,全国热门带正文新闻查询API接口

一、接口介绍 解决同一类新闻在不同平台上的内容获取问题,在归档主流新闻平台的内容数据基础上,对外提供统一的调用方式来完成实时、最新的相关新闻的获取,极大方便各类企业在自有软件中集成新闻内容的功能。支持200余个新闻大站,…

官网安装Python包太慢?教你三种Pytorch的下载安装方式,保证你再也不用出现Error

这一期教大家如何在Anaconda中使用CUDA来进行加速、神经网络依赖cuDNN的下载安装,以及下载和安装Pytorch-GPU安装包的三种方式(conda、pip、轮子)。 还未下载安装 CUDA 和 Anaconda,请看往期文章,是全套系列的总结&am…

@Scope 注解失效了?咋回事

scope 属性,相信大家都知道,一共有六种: 取值含义生效条件singleton表示这个 Bean 是单例的,在 Spring 容器中,只会存在一个实例。prototype多例模式,每次从 Spring 容器中获取 Bean 的时候,才…

如何解决MidJourney错过付费后被暂停

问题 假定你已经成功订阅购买了 MidJourney 一段时间,下个月扣费周期到了。 如果你卡里余额不足,卡被封或失效了,或者你想着最近没啥用得上 MidJourney 的地方先省着不续费,等要用的时候就用不了。 如果想要去官网的续费页&…

软文撰写技巧:中小企业品牌形象塑造新方法

在激烈的市场竞争中,企业仅靠产品质量和服务态度很难站稳脚跟,在互联网时代下,品牌形象才是中小企业的取胜法宝,良好的品牌形象能够赢得消费者的信赖,还能让企业占据市场资源优势,软文推广就是帮助企业塑造…

机器人控制算法——两轮差速驱动运动模型

1.Introduction 本文主要介绍针对于两轮差速模型的逆运动学数学推导。因为在机器人控制领域,决策规划控制层给执行器输出的控制指令v(车辆前进速度)和w(角速度),因此,我们比较关心,当底层两个驱动电机接收到此信息,如何…

企业可以申请ov泛域名SSL证书吗

OV泛域名SSL证书是企事业单位和其他组织合法申请的数字证书,具有组织实名认证和域名解析授权的双重功能。与DV泛域名SSL证书相比,它的申请流程更加复杂,需要提交更多的资质和证明文件,当然,OV泛域名证书的安全等级也更…

如何提取视频文件中的元数据

最近在用gyroflow做视频稳定,但需要校准镜头,而校准需要知道拍摄时的一些设置参数,而用一些普通的工具获取到的视频元数据不全,所以就希望能有什么工具能获取到所有的元数据。找来找去发现Exiftool满足我的需求。 ExifTool 这是个…

机器人控制算法——移动机器人横向控制最优控制LQR算法

1.Introduction LQR (外文名linear quadratic regulator)即线性二次型调节器,LQR可得到状态线性反馈的最优控制规律,易于构成闭环最优控制。LQR最优控制利用廉价成本可以使原系统达到较好的性能指标(事实也可以对不稳定的系统进行整定) ,而且方法简单便于实现 ,同时利用 Ma…

vue3 封装自定义指令,监听元素宽高的变化

最近做一个项目,涉及到echart图,要去根据父元素去自适应宽高,所以需要监听到元素的宽高变化、 因为是监听某一元素的宽高变化,所以这里用的是ResizeObserver. ResizeObserver是可以监听到DOM元素,宽高的变化&#xf…

HarmonyOS/OpenHarmony原生应用开发-华为Serverless服务支持情况(三)

文档中的TS作者认为就是ArkTS之意。 一、云函数,从开发文档上已经说明,是已经支持HarmonyOS/OpenHarmony(Stage模型-API9),但是在开发语言上,没有ArkTS,是否支持,正在实践测试中。 文档地址: …

【PCIE732】基于Kintex UltraScale系列FPGA的2路40G光纤通道适配器(5GByte/s带宽)

PCIE732是一款基于PCIE总线架构的高性能数据传输卡,板卡具有1个PCIe x8主机接口、2个QSFP 40G光纤接口,可以实现2路QSFP 40G光纤的数据实时采集、传输。板卡采用Xilinx的高性能Kintex UltraScale系列FPGA作为实时处理器,板载2组独立的72位DDR…

计算机网络面试常问问题--保研及考研复试

前言: Hello大家好,我是Dream。今年保研上岸山东大学人工智能专业 (经验贴),现在将我自己的专业课备考知识点整理出来,分享给大家,希望可以帮助到大家!这是重点知识总结,…

idea插件开发javax.net.ssl.SSLException: No PSK available. Unable to resume.

idea插件开发,编译出错 javax.net.ssl.SSLException: No PSK available. Unable to resume.at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:129)at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)at java.base/sun.security.ssl.…

【网络基础】IP 子网划分(VLSM)

目录 一、 为什么要划分子网 二、如何划分子网 1、划分两个子网 2、划分多个子网 一、 为什么要划分子网 假设有一个B类IP地址172.16.0.0,B类IP的默认子网掩码是 255.255.0.0,那么该网段内IP的变化范围为 172.16.0.0 ~ 172.16.255.255,即…

202、RabbitMQ 之 使用 fanout 类型的Exchange 实现 Pub-Sub 消息模型---fanout类型就是广播类型

目录 ★ 使用 fanout 类型的Exchange 实现 Pub-Sub 消息模型代码演示:生产者:producer消费者:Consumer01消费者:Consumer02测试结果 完整代码ConnectionUtilPublisherConsumer01Consumer02pom.xml ★ 使用 fanout 类型的Exchange …

干货|小白也能自制电子相册赶紧码住~

你是否想拥有一个独一无二的电子相册,却又苦于不知道如何下手?今天教你一个简单的方法,即使你是小白,也能轻松自制电子相册! 一、选择合适的工具 首先,你需要选择一个合适的工具来制作电子相册。有很多工具…