zoukankan      html  css  js  c++  java
  • JAVA-初步认识-第八章-单例设计模式-内存图解

    一.

    接下来探讨的是,单例设计模式的三句话在内存中到底是什么样的?

    这里一定要铭记,本题是单例,单个对象。为了实现这样的目标,主函数中的语句自然和之前的不一样。

    这进行了改变,main所属的类进行了省略,将SingleDemo类省去了,为了便于讲解。

    所有的操作都是从主函数进栈开始,它是程序的入口。

    方法区是分为两部分,都属于Single类,Single类这个描述类中的所有代码貌似都是进入了方法区,生命周期比较长。

    讲解一下流程,首先是主函数进栈,接着s1也进栈,执行的main中的第一条语句,Single s1=Single.getInstance(),等式左边进栈后,接着就是右边的类调用方法。类调用方法,就是Single类进入方法区,同时默认构造函数(非静态的)也进入非静态区,同时类中的其余的静态代码,静态的新建对象和静态的getInstance()也都进入静态区。getInstance()方法是将其所有代码输入静态区,而静态新建对象进入是将局部变量载入,且初始化为null(在方法区里面,成员变量也有默认值,只要是成员都会有),因为是类类型引用对象,同时在堆内存中创建Single类类型对象,分配地址编号,(这里对象初始化时,可能要将构造函数载入栈中),这个变量目前不在栈里面,在方法区里面。对象新建结束后,将地址值赋值给方法区静态区的s,完成指向。到目前为止,main中的第一句右侧的Single就执行结束了,接着就是Single类调用getInstance()方法了。这时,getInstance()方法就进栈了。进栈完以后,它没有this,因为它是静态的,进栈后,直接运算里面内容的时候,就是return s。这个方法一运算完,返回一个s,这s的值就赋给了s1。方法运算完,会给s1一个结果,这结果就是0x0045。一运算完,getInstance()方法就弹栈了,同时,s1就指向了对象了。main中的第二句Single s2=Single.getInstance(), 先是在栈中产生了s2,接着又调用了一次方法,运算完的结果,同样是s2指向了对象。最后一句就是System.out.println(s1==s2),就是比较s1和s2是否相等,在内存中只有一个对象,两者肯定相等。

    上面所讲述的一切,都是为了验证单例模式三句话在内存中的分布,结果表明就是单例,且外部程序调用的都是同一个对象。

  • 相关阅读:
    一些不能订阅的前端学习资源
    酷站收集
    网页设计学习资源
    flash 内置类的位置
    打造自己的CodeSnippet (转)
    (转)打造自己的CodeSnippet
    WebApplication编程模型与WebSite编程模型
    (转).net面试问答(大汇总)
    ASP.NET 防盗链源码 (转)
    正则表达式基础知识
  • 原文地址:https://www.cnblogs.com/wsw-bk/p/7717675.html
Copyright © 2011-2022 走看看