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

1.简介:

           单例设计模式目的是使得类的一个对象成为系统中的唯一实例

      Java中单例模式的定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供。
      
所谓“懒汉式”与“饿汉式”的区别,是在于建立单例对象的时间不同。“懒汉式”是在你真正用到的时候才去建这个单例对象

饿汉式:在不管你用的用不上,一开始就建立这个单例对象。


2.原因:
         对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。

3.举例:
饿汉式:
class Singleton1{
	
	//定义一个本类对象并实例化
	private static Singleton1 s = new Singleton1();

	//构造方法私有化
	private Singleton1(){}

	public static Singleton1 getInstance(){
		return s;
	}

	public void print(){
		System.out.println("饿汉式-单例设计模式");
	}
}

懒汉式:
class Singleton2{
	
	//定义一个本类对象并实例化
	private static Singleton2 s = null;

	//构造方法私有化
	private Singleton2(){}

	public static Singleton2 getInstance(){
		if(s==null){
			s = new Singleton2();
		}
		return s;
	}

	public void print(){
		System.out.println("懒汉式-单例设计模式");
	}
}

调用:

public class SingletonDemo {		 
    	public static void main(String[]args){
    		Singleton1 s = Singleton1.getInstance();
			s.print();
			Singleton1 s1 = Singleton1.getInstance();
			System.out.println(s==s1);// true

			Singleton2 s2 = Singleton2.getInstance();
			s2.print();
			

    	} 
}

二者区别:

饿汉式和懒汉式区别

从名字上来说,饿汉和懒汉,

饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,

而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。

另外从以下两点再区分以下这两种方式:


1、线程安全:

饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,

懒汉式本身是非线程安全的,为了实现线程安全有几种写法,分别是上面的1、2、3,这三种实现在资源加载和性能方面有些区别。



2、资源加载和性能:

饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成,

而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了

转载于博客:http://blog.csdn.net/jason0539/article/details/23297037/








你可能感兴趣的:(java学习)