设计模式之单例模式(Singleton Pattern)

单例模式分析:

    单例模式主要是为了不由于建立了多个实例形成资源的浪费,且多个实例因为屡次调用容易致使结果出现错误,而使用单例模式可以保证整个应用中有且只有一个实例。从其名字中咱们就能够看出所谓单例,就是单个实例也就是说它能够解决的问题是:能够保证一个类在内存中的对象的惟一性,在一些经常使用的工具类、线程池、缓存,数据库,帐户登陆系统、配置文件等程序中可能只容许咱们建立一个对象,一方面若是建立多个对象可能引发程序的错误,另外一方面建立多个对象也形成资源的浪费。java

单例模式的写法分为:

  • 懒汉式
  • 饿汉式
  • 双重校验锁
  • 静态内部类
  • 枚举

详细信息:

懒汉式:数据库

public class Singleton {

    private Singleton(){}

    private static Singleton instance = new Singleton();

    public static Singleton getInstance(){

        return instance;
    }
}

    优势:这种方式的实现比较简单,在类加载的时候就完成了实例化,避免了线程的同步问题缓存

    缺点:因为在类加载的时候就实例化了,因此没有达到Lazy Loading(懒加载)的效果,也就是说可能我没              有用到这个实例,可是它也会加载,会形成内存的浪费。但这种浪费是能够忽略的。安全

懒汉式[非线程安全]:工具

public class Singleton {

    private static Singleton instance = null;

    private Singleton(){}

    public static Singleton getInstance(){

        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

懒汉式[线程安全,效率低]:spa

public class Singleton {

    private static Singleton instance = null;

    private Singleton(){}

    public static synchronized Singleton getInstance(){

        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }

}

懒汉式[线程安全,效率高]线程

public class Singleton {

    private static Singleton instance = null;

    private Singleton(){}

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

饿汉式:code

public class Singleton {

    private static Singleton instance = null;
    static {
        instance = new Singleton02();
    }
    private Singleton(){}

    public static Singleton getInstance(){
        return instance;
    }
}

内部类模式[推荐]:对象

public class Singleton {

    private Singleton(){}

    private static class SingletonHolder{
        private static Singleton instance = new Singleton();
    }

    public static Singleton getIntance(){
        return SingletonHolder.instance;
    }
}

枚举模式[推荐]:内存

public enum SingletonEnum {

    instance;

    private SingletonEnum(){}

    public void method(){

        System.out.println("SingletonEnum");
    }
}
相关文章
相关标签/搜索