对象的创建过程、DCL与Volatile之间的纠葛

简介: 对象的创建过程、DCL与Volatile之间的纠葛

正文


在我们写代码的过程中,我们很容易、很方便的就可以写出一个类,定义一些属性和方法。当我们使用的时候,直接新建new一个对象,或者想跳过范型检查的话,我们还可以利用反射的方式来创建我们的对象。那么在对象创建的时候,都发生了哪些事以及我们使用对象的时候,应该注意什么呢?


对象的创建过程


通常对象的对创建以及使用分为大致分为下面的几个过程:

21.png


加载:当我们进行创建对象的时候,比如使用new的时候,首先将去检查这个指令的参数是否能在常量池中定位到 一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。

连接:这个过程分为三步,分别是:验证、准备以及解析。在这个过程中,Java虚拟机会进行对该对象进行空间分配,设置初值等。设置对象头,实例数据的初值,以及对齐补充数据。

初始化:在此之前,虽然Java虚拟机已经帮助我们实现了对象的空间分配以及设置默认值等操作,但是对于一些有值的属性会在初始化的时候进行赋值,也就是执行init()方法。执行完初始化的方法后,我们的对象就创建成功了,可以为以后的各个操作提供对象的实例。

使用:使用也是我们操作对象的过程。

卸载回收:使用完毕之后,Java虚拟机会自动的帮助我们将不用的对象内存进行回收。


DCL与Volatile之间的纠葛


DCL我们都知道,是我们使用懒汉式创建我们单例对象时候格式,也就是双重的检验。但是他与Volatile有什么关系呢?

我们在前面可知,在我们对象创建的连接的过程,Java虚拟机已经给我们分配了对象实例的内存大小以及地址,这个时候还没有进行初始化。初始化后,我们的对象实例就可以使用了。但是在多线程并发的时候,由于我们Java虚拟机会优化我们的指令的执行顺序,也就是指令的重排序,在单线程来看,我们的运行结果是没有问题的了。但是多线程的情况下们很有可能会发生我们的对象没有初始化就被其他的线程应用了。这就是对象逸出。

volatile的出现解决了这个问题,因为volatile可以实现指令的内存可见行以及禁止指令的重新排序。实现的方式采用的是内存屏障。有效的解决了我们前面所说的对象没有创建完就使用的情形。

相关文章
|
安全 网络协议 网络安全
|
数据采集 存储 SQL
基于Apache doris的元数据管理系统
什么是元数据?元数据和数据的区别是什么?元数据有什么作用。
1559 0
基于Apache doris的元数据管理系统
|
存储 SQL 分布式计算
基于Apache Hudi + MinIO 构建流式数据湖
基于Apache Hudi + MinIO 构建流式数据湖
532 1
|
7月前
|
Java 调度
ThreadPoolExecutor解析
本文深入解析了Java中`ThreadPoolExecutor`的实现原理,帮助理解线程池的工作机制。核心内容包括任务队列`workQueue`、线程工厂`ThreadFactory`、拒绝策略`RejectedExecutionHandler`等关键成员的作用。通过`submit`和`execute`方法的执行流程,展示了线程池如何根据`corePoolSize`和`maximumPoolSize`动态调整线程数量,并结合`keepAliveTime`管理空闲线程。最后分析了`Worker`类的`run`方法,揭示线程池通过循环从队列中获取任务并执行的核心逻辑。
204 0
|
12月前
|
运维 Devops jenkins
DevOps实践:自动化部署与持续集成的实现之旅
本文旨在通过一个实际案例,向读者展示如何将DevOps理念融入日常工作中,实现自动化部署和持续集成。我们将从DevOps的基础概念出发,逐步深入到工具的选择、环境的搭建,以及流程的优化,最终实现一个简单而高效的自动化部署流程。文章不仅提供代码示例,更注重于实践中的思考和问题解决,帮助团队提高软件开发和运维的效率。
|
SQL 安全 关系型数据库
MySQL安全性:防止攻击和保护数据
MySQL安全性:防止攻击和保护数据
830 1
|
Oracle Java 关系型数据库
2022 年超详细过程步骤讲解 CentOS 7 安装Maven。以及Mavne配置文件的修改
这篇文章提供了在CentOS 7上安装Maven的详细步骤,包括从官网下载Maven、创建文件夹、上传和解压Maven安装包、配置环境变量、设置Maven源为阿里云、指定jar包仓库位置、配置JDK版本,并验证安装是否成功。
2022 年超详细过程步骤讲解 CentOS 7 安装Maven。以及Mavne配置文件的修改
|
存储 安全 数据安全/隐私保护
配置本地安全策略(一)
配置本地安全策略(一)
394 0
QT TextEdit控件 全面详解
本文详细的介绍了TextEdit控件的各种操作,例如:获取内容、输入控件字符、保持在最后一行添加(自动滚屏)、定时关闭、添加数据换行、向鼠标位置插入一行字符、设置字体颜色属性等操作。 本系列QT全面详解文章目前共有十五篇,本系列文章较为详细的讲述了QT控件的基础操作和使用,也谢谢大家的关注、点赞、收藏。
1932 2
QT TextEdit控件 全面详解
|
负载均衡 网络协议 Cloud Native
CentOS环境下安装Nacos
Centos安装Nacos完成入门的学习和开发任务
1568 0
CentOS环境下安装Nacos