设计模式学习--------6.单例模式学习

单例非常简单,只说下一些值得注意的地方。


模式一:懒汉式

需要的时候在初始化,时间换空间,每次获取实例都去判断是否需要创建实例.非线程安全。

package com.kris.study;

public class Singleton {
    private static Singleton instance = null;
    private Singleton(){}
    public static Singleton getInstance(){
    	if(instance == null){
    		instance = new Singleton();
    	}
    	return instance;
    }
}


模式二:饿汉式

开始就初始化,空间换时间.线程安全,在装载类时初始化,不会产生并发,因为虚拟机保证只会装载一次.

package com.kris.study;

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
    	return instance;
    }
}


如何实现线程安全的懒汉模式:

package com.kris.study;

public class Singleton {
    private static Singleton instance = null;
    private Singleton(){}
    public static Singleton getInstance(){
    	if(instance == null){
    		synchronized (Singleton.class) {
				if(instance == null)
			       instance = new Singleton();
    		}
    	}
    	return instance;
    }
}


以上是标准的单例实现


高手的单例解决方案:

package com.kris.study;

public class Singleton {
    private static class SingletonHolder{
    	private static Singleton instance = new Singleton();
    }
    
    private Singleton(){}
    
    public static Singleton getInstance(){
    	
    	return SingletonHolder.instance;
    }
}


当getInstance方法第一次被调用时,它第一次读取SingletonHolder.instance,导致SingletonHolder类得到初始化,而这个

类在装载并被初始化的时候,会初始化他的静态域,从而创建Singleton实例,由于是静态域,因此在装载时才初始化一次.

并由虚拟机来保证线程安全。而且getInstance方法没有被同步.因此不会增加额外的成本.


单例和枚举:

Effective JAVA中提倡用枚举实现单例

package com.kris.study;

public enum Singleton {
	INSTANCE;
    public void singletonOperation(){
    	//功能处理
    }
}





原文地址:https://www.cnblogs.com/krislight1105/p/3748299.html