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