对象初始化过程与单例设计模式(饿汉式与懒汉式)

Posted 眼泪,还是流了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象初始化过程与单例设计模式(饿汉式与懒汉式)相关的知识,希望对你有一定的参考价值。

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学习之单例模式(饿汉式与懒汉式)

单例模式之懒汉式与饿汉式

java软件设计模式——单例设计模式中的饿汉式与 懒汉式示例

单例设计模式的懒汉式与饿汉式

多线程与单例模式

单例模式详解:懒汉式与饿汉式