java创建对象相关知识

PHP服务端 苹果支付(IAP)处理 公司做的app需要做IAP订阅支付,开始觉得和微信的支付流程差不多,做起来还是有点麻烦,主要是网上的文章很少,不能拿来主义。自己做完总结一下,希望对小伙伴们有帮助我就很欣慰了。代码写的不好 不要喷我。。。 首先讲一下我的业务逻辑,也就是php服务端需要做什么事情。 先上图: 下面我详细的讲一下每... 阅读详情

简述java创建对象的过程

(1)检查运行时常量池中是否有该类的符号引用,检查该类是否已经执行了类加载过程。

(2)为对象分配内存,然后将成员变量设为零值。

(3)设置对象头,包括类元信息、哈希码、GC 信息、锁标志位、偏向线程ID等。

(4)执行 init() 方法,初始化成员变量并执行实例化代码块。

(5)调用类的构造方法并把堆内对象的首地址赋值给引用变量。

java对象内存分配如何保证线程安全

(1)采用CAS机制和失败重试的方式保证更新操作的原子性,但效率低,一般不使用该方法。

(2)每个线程在堆中预分配内存,给对象分配内存时直接在预分配的内存中分配。常用该策略**。

简述对象的内存布局

对象的内存布局可分为对象头、实例数据和对齐数据。

对象头,主要包含: MarkWord、类型指针。

  • MarkWord ,默认存储HashCode,分代年龄和锁标志位,并且会复用MarkWord的存储空间,存储的数据根据锁标志位的变化而变化。
  • 类型指针,指向对象对应类的元数据。

实例数据,存储类中定义的成员属性的数据。

对齐数据,起占位作用。HotSpot 虚拟机要求对象的起始地址是8的整数倍,则需要对齐填充。

对象头

一:对象头

HotSpot[虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。

对象头(Object Header包括两部分信息,第一部分用于存储对象自身的运行时数据, 如哈希码(HashCode) 、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,这部分数据的长度在32位和64位的虚拟机中分别为32个和64个Bits,官方称它为“Mark Word”。

对象需要存储的运行时数据很多,其实已经超出了32、64位Bitmap结构所能记录的限度,但是对象头信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机的空间效率,Mark Word被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。例如在32位的HotSpot虚拟机 中对象未被锁定的状态下,Mark Word的32个Bits空间中的25Bits用于存储对象哈希码(HashCode),4Bits用于存储对象分代年龄,2Bits用于存储锁标志 位,1Bit固定为0,在其他状态(轻量级锁定、重量级锁定、GC标记、可偏向)下对象的存储内容如下表所示。

锁标志位与是否偏向锁对应到唯一的锁状态。

对象头的另外一部分是类型指针,即是对象指向它的类的元数据的指针。

锁标志位与是否偏向锁对应到唯一的锁状态。

所以锁的状态保存在对象头中,所以再理解

  1. Synchronized锁的到底是什么, 锁住的是代码还是对象(答案锁的是对象)?
  2. java中锁,锁的是对象,它是怎么实现的?

这两个问题,就好懂了!

二:锁的状态

锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁(但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级)。

1、轻量级锁的加锁过程

(1)在代码进入同步块的时候,如果同步对象锁状态为无锁状态(锁标志位为“01”状态,是否为偏向锁为“0”),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的Mark Word的拷贝,官方称之为 Displaced Mark Word。这时候线程堆栈与对象头的状态如图2.1所示。

(2)拷贝对象头中的Mark Word复制到锁记录中。

(3)拷贝成功后,虚拟机将使用CAS操作尝试将对象的Mark Word更新为指向Lock Record的指针,并将Lock record里的owner指针指向object mark word。如果更新成功,则执行步骤(4),否则执行步骤(5)。

(4)如果这个更新动作成功了,那么这个线程就拥有了该对象的锁,并且对象Mark Word的锁标志位设置为“00” ,即表示此对象处于轻量级锁定状态,这时候线程堆栈与对象头的状态如图2.2所示。

(5)如果这个更新操作失败了,虚拟机首先会检查对象的Mark Word是否指向当前线程的栈帧,如果是就说明当前线程已经拥有了这个对象的锁,那就可以直接进入同步块继续执行。否则说明多个线程竞争锁,轻量级锁就要膨胀为重量级锁,锁标志的状态值变为“10”,Mark Word中存储的就是指向重量级锁(互斥量)的指针,后面等待锁的线程也要进入阻塞状态。 而当前线程便尝试使用自旋来获取锁,自旋就是为了不让线程阻塞,而采用循环去获取锁的过程。

三、偏向锁

引入偏向锁是为了在无多线程竞争的情况下尽量减少不必要的轻量级锁,因为轻量级锁的获取及释放依赖多次CAS原子指令,而偏向锁只需要在置换ThreadID的时候依赖一次CAS原子指令(由于一旦出现多线程竞争的情况就必须撤销偏向锁,所以偏向锁的撤销操作的性能损耗必须小于节省下来的CAS原子指令的性能消耗)。上面说过,轻量级锁是为了在线程交替执行同步块时提高性能(减小线程切换开销),而偏向锁则是在只有一个线程执行同步块时进一步提高性能(减少获取锁的开销)。

1、偏向锁获取过程:

(1)访问Mark Word中偏向锁的标识是否设置成1,锁标志位是否为01——确认为可偏向状态。

(2)如果为可偏向状态,则测试线程ID是否指向当前线程,如果是,进入步骤(5),否则进入步骤(3)。

(3)如果线程ID并未指向当前线程,则通过CAS操作竞争锁。如果竞争成功,则将Mark Word中线程ID设置为当前线程ID,然后执行(5);如果竞争失败,执行(4)。

(4)如果CAS获取偏向锁失败,则表示有竞争。当到达全局安全点(safepoint)时获得偏向锁的线程被挂起,偏向锁升级为轻量级锁,然后被阻塞在安全点的线程继续往下执行同步代码。

(5)执行同步代码。

2、偏向锁的释放:

偏向锁的撤销在上述第四步骤中有提到。偏向锁只有遇到其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁,线程不会主动去释放偏向锁。偏向锁的撤销,需要等待全局安全点(在这个时间点上没有字节码正在执行),它会首先暂停拥有偏向锁的线程,判断锁对象是否处于被锁定状态,撤销偏向锁后恢复到未锁定(标志位为“01” )或轻量级锁(标志位为“00”) 的状态。

3、重量级锁、轻量级锁和偏向锁之间转换

该图主要是对上述内容的总结,如果对上述内容有较好的了解的话,该图应该很容易看懂。

Cursor AI编程工具保姆级安装指南:从下载到中文界面设置(含免费额度说明) 本文提供Cursor AI编程工具的保姆级安装与设置教程。详细指导从官网下载、安装到中文界面切换的每一步,并重点说明其每月500次高级模型调用的免费额度策略。通过个性化设置与核心插件推荐,帮助开发者快速上手,提升AI辅助编程效率。 阅读详情

相关推荐

从零开始 使用OMNET++结合VEINS,INET和SUMO的联合仿真

搭建仿真的环境,导入VEINS和INET开源库,使用INET库中提供的网络协议和功能模型来模拟通信协议和网络功能,使用SUMO创建道路网络和车辆轨迹,并导出到OMNeT++中 在OMNeT++中使用VEINS通过socket和SUMO连接,借助VEINS实现的TRACI接口来设置车辆相关的行为和场景,最后在OMNET++中结合VEINS,SUMO和INET运行联合仿真实验,并分析车辆在遇到紧急情况下的通信状况和具体行为

mjmmm的博客 1万+

在JAVA中如何创建一个对象?

其中,memberVariableName为对象的成员变量名称,value为要赋给成员变量的值,也可以在构造方法中初始化成员变量。这样就创建了一个名为stu的Student对象,并赋值name为"Tom",age为18。其中,classname为类的名称,objectname为新对象的名称。

2301_78263023的博客 504

STMCubeMX使用TB6612驱动编码轮并进行测速

TB6612电机驱动模块通过IN1和IN2引脚控制电机的旋转方向,并通过PWM信号的占空比调节电机速度。代码示例展示了如何使用GPIO控制电机的正反转,以及如何动态调整PWM占空比实现速度控制。系统设计中,TB6612与编码减速电机连接,STM32CubeMX用于初始化GPIO和PWM输出。编码器接口配置使用TIM3进行测速,TIM4定时器用于速度计算。Keil软件中编写的代码包括编码轮计数值获取、速度计算、电机正反转控制以及小车运动控制等功能。通过OLED显示速度,并实现电机的调试与测试。

wwivn的博客 2262

java如何创建一个全局的对象

如何在Java中创建一个全局的对象 在Java中,有时我们需要创建一个全局的对象,即在整个应用程序中都可以访问的对象。这种全局对象可以用来保存一些全局的配置信息、共享的数据等。在本文中,我们将介绍如何在Java中创建一个全局的对象,并通过一个实际的问题来展示如何使用全局对象来解决这个问题。 实际问题 假设我们有一个多线程的...

weixin_41030850的博客 306

谷歌浏览器崩溃排查:闪退、卡死、网页打不开的修复指南

浏览器多进程架构通过进程隔离、GPU加速和扩展沙箱提升网页渲染效率,但配置损坏、扩展冲突、显卡驱动异常或系统资源不足时,常会以闪退、卡死、白屏、内存占用飙升和能上微信却打不开网页等形式暴露。排查价值在于先分层定位系统、进程、配置扩展与网页内容,再用无痕模式、chrome://crashes、chrome://gpu和浏览器任务管理器收集证据,避免盲目重装。对办公、开发运维和日常维护场景,禁用扩展、关闭硬件加速、刷新DNS缓存、重置配置文件乃至干净重装,都是可复用的工程化处置手段。围绕谷歌浏览器崩溃的典型症状

weixin_34138056的博客 426

MuJoCo 仿真中的碰撞检测与参数优化实战

本文深入解析MuJoCo仿真中的碰撞检测机制与参数优化策略,涵盖位掩码配置、凸包分解实战及穿模问题解决方案。通过具体案例和参数设置建议,帮助开发者高效解决机械臂抖动、轴孔装配等常见问题,提升仿真精度与稳定性。特别针对步进电机仿真提供了高增益位置执行器的优化方案。

weixin_29081101的博客 334

Java创建对象的四种方式

1.new关键字创建对象2.通过反射机制创建对象3.使用clone方式4.通过序列化机制

ggggggzzzzz的博客 1443

流体动力学仿真软件:XFlow_(20).案例研究:声学仿真

在流体动力学仿真软件中,声学仿真是一个重要的应用领域。通过数值模拟,工程师和科研人员可以预测和分析流体系统中的声学现象,如气动噪声、声波传播和声场分布。这些仿真结果对于优化设计、降低噪声水平和提高系统性能具有重要意义。本节将详细介绍如何在流体动力学仿真软件中进行声学仿真,包括声学模型的选择、参数设置、后处理分析等内容,并通过具体的案例来说明这些步骤。

kkchenjj的博客 902

JavaScript全局函数与自定义函数-Functions

全局属性和函数可用于所有内建的 JavaScript 对象。我们经常会用到一些内置的全局函数如parseInt();parseFloat()等等,另外我们可以根据自己的业务需要编写自己的函数。 全局函数 全局对象描述 全局对象是预定义的对象,作为 JavaScript 的全局函数和全局属性的占位符。通过使用全局对象,可以访问所有其他所有预定义的对象、函数和属性。全局对象不是任

纸上得来终觉浅,绝知此事要躬行 1万+

【科研数据获取】根据Excel表个中的企业/公司信息批量获取经纬度坐标,并进行地图可视化

批量获取企业/公司的经纬度坐标,并进行地图可视化1 需求2 实现途径3 需求逐步实现 1 需求 在做项目的时候,老板或者项目答辩时候甲方最喜欢看到的就是可视化结果,尤其是涉及到地图可视化。很多时候会遇到企业/公司的数据,想要做地图可视化,必不可少的就是要获取它们具体地址:第一种就是像查户口一样精准一下具体的城镇街道,还有一种就是经纬度信息,前一种属于文字内容往往用于管理方面,第二种数字信息多用于数据处理与分析。 2 实现途径 获取地理信息数据,自然需要使用到地图的功能,这里直接采用百度地图的拾取坐标系统,

lys_828的博客 2337

【云原生技术】云计算与网络:容器服务(Tencent Kubernetes Engine,简称TKE)简介

基本概念主要特点应用场景技术实现容器服务(Tencent Kubernetes Engine,简称TKE)是腾讯云提供的一种托管的容器管理服务,基于开源的Kubernetes系统。TKE旨在简化容器的部署、管理和扩展,并且提供高性能、可靠性和安全性,适用于各种规模的企业和应用。

weixin_46453070的博客 2046

一起学Java:类和对象(一)

JAVA是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互 完成。而C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐渐 解决问题。 1.类和对象 1.1初步认识 类就是一类对象的统称,对象就是这一类具体化的一个实例。这一类对象所具备的共同属性和行为(方法)都在类中定义。 举个例子:我们做月饼的模子就是一个类,而通过这个模子可以做出月饼,那么在这个例子当中,类就是那个模子,而月饼就是那个对象,所以月饼就是一个实体。一个模子可以实例化无数个对象..

m0_64805792的博客 408

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java创建对象内存分析

java创建对象内存分析

冰羽 179

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

javaSE-第102-创建对象

语法格式: 类型 引用名称 = new 类型();

java孤独求败的博客 196

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java-创建对象和访问属性

java-创建对象和访问属性

m0_59605707的博客 97

String 与 包装类的静态创建对象的值被存在哪里

包装类的静态创建对象的值被存在哪里: public static void main(String[] args) { Integer ii = 12; Integer ii1 = 12; Integer bb1 = 128; Integer bb2 = 128; Integer ii2 = 12; Integer ii3 = new Integer(12); Integer ii4 = 2 + ii3; Integer ii5 =

qq_43079667的博客 151

JVM创建对象的过程

JVM创建对象的过程如下:

a544272939的博客 363

狂神JAVA学习笔记 JAVA面向对象06 创建对象内存分析

qq_58278890的博客 119

Java中文件File相关知识

本文概述了Java中文件的相关知识,主要包括文件的常用API,如何创建文件对象,对文件进行一些基本的操作.最后给出了文件搜索的解法

yhb500234的博客 666

java反射 创建对象_反射Java反射对象创建 - Java教程

Java反射 -Java反射对象创建我们可以使用反射动态创建类的对象。通过调用其中一个构造函数。然后我们可以访问对象的细分的值,设置它们的值,并调用它们的方法。有两种方法来创建对象:使用no-args构造函数使用带参数的构造函数无参数构造函数如果您有一个 Class 对象的引用,您可以创建一个对象该类对Classclass使用 newInstance()方法。此方法不使用参数,并且是等效的使用n...

weixin_39599342的博客 448

五种创建Java对象的方法,你知道几种呢?

这个小伙伴自然就非常迅速地说出了new的方式,结果面试官又继续追问还有哪些别的方式,他就支支吾吾半天不知道了。但是大家要注意,使用该方法的前提是,我们必须先让类实现Cloneable接口,并重写Object的clone方法(因为Object中的这个方法是protected的,若不重写,外部也调用不了)。以上就是波哥为小伙伴们介绍的五种创建对象的方法,现在你知道都有哪些创建Java对象的方式了吗?由此我们就可以知道,这个User对象就是从之前的userFile.txt文件中获取到的。

Python专栏 5022

Java string知识点_【Java基础】String 相关知识点总结

String 相关知识点总结字符串的不可变性概述String 被声明为 final,因此它不可继承在 Java8 中,String 内部使用 char 数组存储数据public final class Stringimplements java.io.Serializable, Comparable, CharSequence {/** The value is used for characte...

weixin_35548251的博客 205

Java必备知识点

29.抽象类:如果一个类中有抽象方法,那么这个类一定是抽象类(1.抽象类不能创建对象 2.抽象类的子类必须重写父类中的方法,否则的话子类也是抽象类)通过抽象类可以强制的要求子类中必须有哪些方法(也就是我们在父类中有这个方法,在子类中必须重写) 30.抽象类中可以有正常的方法 31.另一种常见的得到上转型对象的操作,一定记住抽象类不能通过new来创建对象 32.错误的代码示例:我们不能在main方法中直接对一个抽象类进行new来创建一个对象 33.正确的案例:画框的代码也

2303_81838541的博客 331

java 接口签名_求职者面试必备:Java概念相关的面试题及答案

近几年Java行业的火热想必大家已经熟知,而且越来越多的年轻人投身于程序猿大军之中。学完Java技术面临的就是求职问题了。疫情之下对于Java求职者有了更多的要求,程序员想要进入自己期望的公司需求提前做好充分的准备。那么对于初入职场的程序小白而言,在面试Java相关职位时,会遇到什么样的难题呢?下面罗列15道常见Java概念相关的面试题,供以参考,希望对你有所帮助。1、面向对象的三个特征封装,继承...

weixin_30954879的博客 109

String创建对象问题

String str=new String("aaa"); 这行代码究竟创建了几个String对象呢?答案是2个,而不是3个。一个就是放在常量池中的 "aaa" 对象,而另一个就是创建出来的放在堆时原实例对象,而另当然这里的str本身只是一个引用,放在栈里,用来指向堆中创建出来的对象。 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的

踏雁寻花 1891

Java的字符串的基础知识(必看)

运行结果:这几行代码展示了Java中对字符串(String)对象的操作。首先,代码创建了一个名为name的字符串变量,并将其初始化为"123",即。接下来,代码将字符串变量name的值修改为"456",即。在Java中,字符串是不可变的(immutable),这意味着一旦创建了一个字符串对象,就无法修改它的值。但是,当我们修改字符串变量时,实际上是创建了一个新的字符串对象,并将变量指向新的对象。最后,代码使用方法将字符串变量name的值打印到控制台。由于name。

2301_80142564的博客 2080
上一篇: Java 适配器模式
下一篇: 怎样让Java编译器帮你写代码
Java_ttcd
博客等级 码龄4年 198粉丝 190原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值