实现单例模式主要考虑以下三点:
- 是否线程安全
- 是否懒加载
- 能否通过反射破坏(枚举类型不能反射)
一般的单例模式都符合前面两点,线程安全和懒加载;但是都可以通过反射破坏,不过反射一般是人为的操作,可以避免。如果想要不被反射,可以使用枚举类型,但是枚举类型会在程序一启动就会加载,不能懒加载。
单例模式通常分为饱汉式、饿汉式、双检式、枚举,还有一个模式可以通过静态内部类实现
静态内部类写法
优点:
- 静态内部类是你第一次调用的时候才实例化,而静态代码块,在程序启动加载时就实例化了
- 相比之下节省了内存
/**
* 内部类,只要没有被使用,就不会初始化,Singleton的实例就不会创建
* 在第一次有人调用getInstance方法的时候,内部类会初始化,创建一个Singleton的实例
* 类静态初始化的过程一定只会执行一次
*/
public class LazySingleton {
private static class InnerHolder {
private static final LazySingleton INSTANCE = new LazySingleton();
}
private LazySingleton() {}
public static LazySingleton getInstance() {
return InnerHolder.INSTANCE;
}
}
这里只记录一下,其他方式和各种方式的优劣势可以看看这篇文章,这里我就不赘述了
https://blog.csdn.net/can_meng_yun/article/details/125778902