zoukankan      html  css  js  c++  java
  • 对象初始化过程与单例设计模式(饿汉式与懒汉式)

    1.对象初始化过程:(先加载类到内存,然后加载类属性,成员方法)

       定义一个类Person,  在new Person("zhangsan",20); 初始化过程:

    1. 因为new 用到Person.class文件,所以会先找到Person.class文件并加载到内存中.
    2. 执行该类中的static静态代码块,如果有的话,给Person.class类进行初始化.
    3. 在对内存中开辟空间,分配内存地址.

       4.在对内存中建立对象的特有属性,并进行默认初始化.

       5.对属性进行显示初始化.

       6.对对象进行对应的构造代码块初始化.

      7.对对象中构造函数进行初始化.,

      8.将内存地址付给栈内存中的p变量.

    注意: 静态只能在栈内存里,非静态变量在堆里. 

    2.单例设计模式:解决一个类在内存中只存在一个对象(保证对象唯一).

      1.禁止其他程序建立该类对象.

      2.在本类自定义一个对象.

      3.为了提供其他程序使用该类对象,对外提供一些访问方法.

      解决问题:

        1.将构造函数私有化.(私有化无参构造函数,这样外界就不能直接访问该类对象.)

        2.在类中创建一个本类对象.(静态类)

        3.提供一个方法可以获取到该对象(静态方法).

    懒汉模式

    关键点:

    1)构造函数定义为私有----不能在别的类中来获取该类的对象,只能在类自身中得到自己的对象

    2)成员变量为static的,没有初始化----类加载快,但访问类的唯一实例慢,static保证在自身类中获取自身对象

    3)公开访问点getInstancepublicsynchronized-----public保证对外公开,同步保证多线程时的正确性(因为类变量不是在加载时初始化的)

    饿汉模式

    关键点:

    1)私有构造函数

    2)静态私有成员--在类加载时已初始化

    3)公开访问点getInstance-----不需要同步,因为在类加载时已经初始化完毕,也不需要判断null,直接返回

    懒汉式的优点是延时加载、缺点是应该用同步、其实也可以不用同步、看你的需求了,多创建一两个无引用的废对象其实也没什么大不了。

     

     

    单例中懒汉和饿汉的本质区别在于以下几点:
      1、饿汉式是线程安全,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。
      2、从实现方式来讲他们最大的区别就是懒汉式是延时加载,他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,饿汉式无需关注多线程问题、写法简单明了、能用则用。但是它是加载类时创建实例、所以如果是一个工厂模式、缓存了很多实例、那么就得考虑效率问题,因为这个类一加载则把所有实例不管用不用一块创建。

     

    工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。这两个模式区别在于需要创建对象的复杂程度上。

     

    线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。线程安全问题都是由全局变量静态变量引起的。

     

    单利模式呢 就是永远保持一个对象,懒汉模式在运行的时候 获取对象比较慢,但是加载类的时候比较快,但是饿汉模式是在运行的时候获取对象较快,加载类的时候慢。

     

    单例模式有以下特点:
      1、单例类只能有一个实例。
      2、单例类必须自己创建自己的唯一实例。
      3、单例类必须给所有其他对象提供这一实例

     

  • 相关阅读:
    第五小节之JAVA IO流
    第四小节之Java 集合类
    初学的重点
    第三小节之Java API
    实践周java基础软件开发app之五子棋
    出栈合法性
    Python介绍
    Ubuntu主题美化篇
    Ubuntu16.04比较好的一系列软件安装介绍
    Ubuntu使用Shadow socks-qt5
  • 原文地址:https://www.cnblogs.com/yang82/p/8119670.html
Copyright © 2011-2022 走看看