作者:米粒尖尖果儿_445 | 来源:互联网 | 2024-10-18 18:41
大家可能都看过单例模式的几种写法,其中饿汉式最简单,懒汉式中双重check最为复杂。双重check需要考虑多线程同步,变量的可见性。还有的要求设置构造器为private。
麻烦!麻烦!超麻烦!单例是什么?字面上理解,一个实例。那这个一个实例是指使用一个实例,还是整个进程中只有一个实例?我的理解是使用同一个实例。
那private还有意义吗?阻止外部存在实例?反射怎么办?
再说懒汉模式,延时加载。到底延时什么?是想在调用getInstance方法时在实例化?饿汉模式难道不是!懒汉模式的延时是为了等待其它数据的就绪。也就说,只有当需要外部资源才能完成实例化的时候,懒汉模式才有意义。
解释一下为什么饿汉模式也是延时加载。当一个类被使用时,它才会被加载,完成成员变量的初始化。看下面两个类:
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
private Singleton(){
System.out.println("Singleton实例化了");
}
public static Singleton getInstance(){
return INSTANCE;
}
}
public class Main {
public static void main(String[] args) {
System.out.println("Main start");
Singleton.getInstance();
}
}
运行Main类的结果是:
由于类的这个特性,可以使用内部类持有当前类实例的。并且需要等待的其它数据也可以进行传递,彻底抛弃双重check的写法。
说了这么多,感觉还是Spring的单例好,没这么多事。
本篇到此结束,如果读完觉得有收获的话,欢迎点赞、关注、加公众号【贰级天災】,查阅更多精彩历史!!!