单例非常简单,只说下一些值得注意的地方。
模式一:懒汉式
需要的时候在初始化,时间换空间,每次获取实例都去判断是否需要创建实例.非线程安全。
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(){ //功能处理 } }