`
computerlibin
  • 浏览: 8355 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

jvm类加载之初始化顺序

 
阅读更多
分析这个程序的执行结果:
public class Singleton { 
    private static Singleton obj = new Singleton(); 
    public static int counter1; 
    public static int counter2 = 0; 
    private Singleton(){ 
        counter1++; 
        counter2++; 
    } 

    public static Singleton getInstance(){ 
        return obj; 
    } 

    public static void main(String[] args) { 
        Singleton obj = Singleton.getInstance(); 
        System.out.println("obj.counter1: " + obj.counter1); 
        System.out.println("obj.counter2: " + obj.counter2); 
    } 
} 

这个和Java初始化顺序有关,
由于你的第一句是
private static Singleton obj = new Singleton();
所以在初始化静态变量obj时中间插入了一个构造函数,造成了counter1和counter2最后的结果不一样。完整的时间链如下

1) JVM调用Singleton.Main,由于这是一个static method,JVM必须构造Singleton的所有static member(也就是说jvm必须先初始化static变量,之后才能执行静态方法Singleton.getInstance()),按照Java Specifiction的要求,指针被初始化为null,数值为0。到此为止 counter1=0,counter2=0

2)接下来,按照自上而下的顺序,完成所有static member的赋值操作。第一个赋值操作是(static)obj = new Singleton() ,JVM会调用Singleton的构造函数,完成counter1和counter2的赋值。到此为止 counter1=1,counter2=1

3)接着执行的是private static Singleton obj = new Singleton();的下一句(public static int)counter2 = 0;到此为止 counter1=1,counter2=0


你可以试试把private static Singleton obj = new Singleton();放到最后,则结果就都是1了。
分享到:
评论

相关推荐

    JVM类加载机制详细讲解

    类加载不仅包括加载,还包括验证、准备、解析和初始化等阶段。验证阶段确保字节码的正确性,准备阶段为类的静态变量分配内存并初始化为默认值,解析阶段将符号引用转换为直接引用,初始化阶段执行类的初始化方法 `()...

    java程序初始化顺序

    在Java编程语言中,程序初始化的顺序是一个关键概念,它涉及到类加载、对象创建以及执行流程的安排。了解这些顺序对于编写高效、无错误的...在实际项目中,合理利用初始化顺序可以帮助我们优化资源加载,提高程序性能。

    探究java的ClassLoader及类变量初始化顺序

    同时,掌握类变量初始化顺序可以避免因误解而导致的错误,特别是在多线程环境中,对静态变量的并发访问和初始化顺序的控制需要特别注意。 总之,深入理解Java的ClassLoader机制和类变量初始化顺序是提升Java编程...

    Java虚拟机JVM类加载学习笔记

    而当初始化顺序改变,先初始化静态变量再创建`singleton`实例时,`a`和`b`的值都变为1,这是因为静态变量的初始化发生在类加载后、类初始化前。 理解JVM的类加载机制对于优化程序性能、解决类加载问题以及深入学习...

    JVM类加载器说明文档

    类加载的过程包括三个主要步骤:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和初始化(Initialization)。其中,加载是查找并加载类的二进制数据;验证确保类的数据符合JVM...

    java中类的初始化顺序

    ### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...

    java代码的初始化顺序demo

    总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...

    JVM类加载机制1

    类的静态变量和静态代码块在类加载时只初始化一次,按照它们在源代码中的顺序执行。它们在内存中属于类级别的,所有类的实例共享同一份静态变量和静态代码块的拷贝。 总结来说,JVM类加载机制保证了Java程序的稳定...

    JAVA面试题解惑系列——类的初始化顺序

    在Java中,类的初始化顺序是面试中的经典问题之一,它涉及到继承、静态成员以及实例成员等多个方面。正确理解类的初始化顺序对于编写正确、高效的代码至关重要。 首先,需要了解Java类初始化的基本规则,即在类的...

    性能调优专题-jvm类加载机制-performance-jvmclassloader.zip

    其中,加载是读取.class文件,验证确保字节码安全,准备分配静态变量内存,解析绑定符号引用,初始化执行类的初始化方法。 4. **类的加载条件** 类的加载并非在程序启动时一次性完成,而是按需加载。只有当类被...

    Java类加载器:静态变量初始化.docx

    在本文中,我们讨论了 Java 类加载器中的静态变量初始化机制,了解了静态变量的初始化顺序和类加载器的生命周期。通过对静态变量初始化机制的理解,我们可以更好地掌握 Java 语言的基础知识,并更好地应用 Java 语言...

    java对象的初始化顺序[参考].pdf

    Java对象的初始化顺序是一个关键的编程概念,它涉及到类加载、静态初始化、实例初始化等多个步骤。下面我们将详细探讨这些步骤。 首先,当程序运行并创建一个新的对象时,JVM(Java虚拟机)会按照特定的顺序来初始...

    Java类加载初始化的过程及顺序

    Java类加载初始化的过程是Java编程语言中一个重要的概念,它决定了Java类的加载和初始化顺序。在Java中,类的加载是通过类加载器(ClassLoader)来实现的。类加载器会将类的字节码文件(.class)加载到Java虚拟机...

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf

    在Java编程世界中,类的初始化顺序是理解面向对象编程概念的一个重要方面。尤其对于那些准备应对技术面试的Java程序员和工程师来说,掌握这一知识点是面试时的必备能力之一。本文将深入探讨Java中类的初始化顺序,...

    坚持写博客第一周--java基础知识回顾--jvm类加载1(csdn)————程序.pdf

    5. **初始化**:执行类的静态初始化代码块和初始化静态变量为它们的指定值,这是类加载的最后一步,确保了类在使用前完成初始化。 6. **使用和卸载**:类加载后,JVM会持续使用这些类,直到程序结束或者类不再被...

    深入java虚拟机加载初始化

    ### 深入Java虚拟机加载初始化 #### Classloader的作用及意义 在深入了解Java虚拟机(JVM)的加载初始化之前,我们先明确一下`Classloader`...希望本文能够帮助您更好地掌握Java虚拟机的核心机制之一:类加载初始化。

    JVM:类加载器子系统.pdf

    综上所述,JVM的类加载器子系统是复杂且精细的,它涉及到了类的加载、验证、准备、解析和初始化等多个环节。而类加载器作为类加载过程中的关键组件,其设计使得Java应用程序能够灵活地加载和运行各种不同的类文件。...

    Java初始化块Java初始化块.doc

    类的加载和初始化顺序: - 类加载:JVM首次主动使用某个类时,会进行类加载,包括类的验证、准备和解析阶段。 - 类初始化:在类初始化阶段,静态属性的内存被分配,然后执行静态初始化块来初始化静态属性。这个过程...

Global site tag (gtag.js) - Google Analytics