常见的五种单例模式的总结:
1,饿汉式
类初始化的时候就马上生成对象,肯定是线程安全的,但没有延时加载,对系统性能是一种浪费。
2,懒汉式
可以延时加载,但调用getinstance方法需要同步,并发效率低。
3,双重检验锁的实现:
class Singleton{
private static Singleton instance = null;
private Singleton() {
System.out.println("构造方法:"+Thread.currentThread().getName());//格式错误
}
public static Singleton getInstance(){
if(instance ==null) {
Singleton sc;
synchronized(Singleton.class) {
sc = instance;
if(sc ==null) {
synchronized(Singleton.class) {
if(sc ==null) {
sc = new Singleton();
}
}
instance = sc;
}
}
}
return instance;
}
}
这个模式将同步内容下放到if内部,提高了执行效率,不用每次获取对象时都进行同步,只有第一次同步,创建了对象之后就没必要了。只有第一次会进去,之后instance不为空,直接返回instance。 看起来综合了同步和延时加载的双重优点。
但由于编译器优化问题和JVM底层内部模型原因,偶尔会出问题。
4,静态内部类实现方法
public class SingletonDemo04 {
private static class SingletonClassInstance{
private static final SingletonDemo04 instance = new SingletonDemo04();
}
public static SingletonDemo04 getinstance() {
return SingletonClassInstance.instance;
}
private SingletonDemo04() {
}
}
同时实现了延时加载和线程同步,类加载天然的线程安全的。
直接调用,不需要同步等待,所以调用效率高。
5,使用枚举实现单例模式
实现简单,枚举类本身就是单例模式,由JVM从根本上提供保证,避免通过序列化和反序列化的漏洞。
但无延时加载。