单例模式的实现方法有多种:懒汉式,饿汉式,枚举,静态内部类,这里记录一下静态内部类实现单例模式
public class StaticSingle {
private StaticSingle(){}
static class StaticSin{
private static StaticSingle INSTANCE = new StaticSingle();
}
public static StaticSingle getInstance(){
return StaticSin.INSTANCE;
}
}
静态内部类的优点是:外部类加载时并不需要立即加载内部类,内部类不被加载则不去初始化INSTANCE,故而不占内存。而且他是线程安全的。当多个线程调用getInstance获取单例的时候,getInstance()方法并没有多次去new对象,故不管多少个线程去调用getInstance()方法,取的都是同一个INSTANCE对象,而不用去重新创建。
线程安全的原因在于类加载的过程是线程安全的,可以看下底层虚拟机类加载的机制,是加了锁的保证了安全性。静态内部类不属于外部类,所以外部类被加载时,内部类也不会被加载,只有在使用时才会被加载,实现了懒加载。
缺点:如果想要在创建对象时传入参数,这种方式则不能满足要求。
需要创建一个无关的外部类的对象来获取。
并且反射可以破坏单例(除了枚举方式,其他都能被破坏,反射实在是太强大)。
虽然枚举方法可以做到绝对安全,但是也有其缺点。
其他的单例模式可以参考:https://blog.csdn.net/Brath/article/details/120224675