何时使用单例模式:
当需要控制一个类的实例只有一个, 而且客户只能从一个全局访问点去访问她。
经典的单例模式有两种,懒汉式和饿汉式,各自都有各自的缺点,使用内部类能更好的完成,延迟加载和线程安全。
public class Singleton {
/***
* 类的内部类,也就是静态成员的内部类,该内部类的实例与外部类的实例没有绑定关系
* 只有被调用的时候才会装载,从而实现了延时加载
*
*/
public static class SingletonHolder {
/**
* 静态初始化器,JVM保证线程安全
*/
private static Singleton instance = new Singleton();
}
/**
* 私有化构造方法
*/
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
当getInstance方法第一次被调用的时候,她第一次读取SingletonHolder.instance,导致SingletonHolder类被初始化,而这个类在装载并初始化的时候会初始化他的静态域,从而创建singleton实例,由于是静态的域,所以只会在虚拟机装载类的时候加载一次,并由虚拟机保证她的线程安全
这个模式的优势在于,getInstance并没有被同步,并且只执行一个域的访问,因此延迟初始化并没有增加访问成本。
还可以尝试使用单元素的枚举,来实现singleton,只要编写一个单元素的枚举类型即可。