设计模式系统-单例模式

371 阅读1分钟

1.饿汉式:单例模式在类装载时就实例化

      优点:a.线程安全,在类加载时就创建好静态对象,调用速度快
      确定: 资源利用率不高,可能永远也无法执行到getInstance方法,但是多次通过别的静态方法加载该类(Class.forName(Singleton1.Class)),但每次仍会创建实例

public class Singleton1{ private Singleton1{

}
Singleton1 instance=new Singleton1();
public static Singleton1 getInstance{
    return instance;
}

}

2.饱汉式:单例实例在第一次被使用时构建,延迟初始化

优点:避免了资源耗费
缺点:线程不安全,在多线程中可能出现多个Sinleton2实例

public class Singleton2{ private Singleton2{

}
Singleton2 instance=null;
public static Singleton2 getInstance{
    if(instance==null){
        return new Singleton2();
    }
}

}

若要改进,首先想到加锁:

优点:资源利用率高,不执行getInstance就不会实例化,可以执行该类的其他静态方法

缺点:多线程增加了不必要的开销 public class Singleton3{ private Singleton3{

}
Singleton3 instance=null;
public static synchronized Singleton3 getInstance{
    if(instance==null){
        instance= new Singleton3();
    }
    return instance;
}

}

4.双重加锁机制

优点:资源利用率高,不执行getInstance就不会实例化,可以执行该类的其他静态方法 缺点:第一次加载不够快,

public class Singleton4{ private Singleton4{

}
Singleton3 instance=null;
public static Singleton4 getInstance{
    if(instance==null){
        synchronized(Singleton4.class){
            if(instance==null){
                instance = new Singleton4();
            }
        }
    }
    return instance;
}

}

5.静态内部类

优点:资源利用率高,不执行getInstance就不会实例化,可以执行该类的其他静态方法 缺点:第一次加载时响应不快

public class Singleton5{ private Singleton{

}
private static class SingletonHandler{
    static Singleton5 instance=new Singleton5();
}

private Singleton5 getInstance{
    return SingletonHandler.instance;
}

}

总结:一般采用饿汉式,若资源有限,可采用静态内部类。