需求:加载配置文件,由于配置文件全局唯一,所以不用过多对象,建一个就可以了。
优点:单例模式本质就是为了控制实例数目。
一、饿汉式
public class Singleton { private Singleton (){ //加载配置文件.... } private static Singleton singleton = new Singleton(); public static Singleton getInstance(){ return singleton; } }
二、懒汉式
public class Singleton { private Singleton (){ //加载配置文件.... } private static Singleton singleton = null; public static Singleton getInstance(){ if(singleton==null){ singleton = new Singleton(); } return singleton; } }
这种懒汉式存在线程安全问题,可以利用双重检查加锁避免。
public class Singleton { private Singleton (){ //加载配置文件.... } private volatile static Singleton singleton = null; public static Singleton getInstance(){ if(singleton==null){ synchronized (Singleton.class){ if(singleton==null){ singleton = new Singleton(); } } } return singleton; } }
这种方式解决了线程安全为题,但用了volatile,效率降低,用静态内部类可以解决这一问题。
public class Singleton { private Singleton (){ //加载配置文件.... } private static class SingletonHolder{ private static Singleton singleton = new Singleton(); } public static Singleton getInstance(){ return SingletonHolder.singleton; } }
三、枚举
public enum Singleton { instance; Singleton(){ //加载配置文件.... } }