單例模式主要是爲了不由於建立了多個實例形成資源的浪費,且多個實例因爲屢次調用容易致使結果出現錯誤,而使用單例模式可以保證整個應用中有且只有一個實例。從其名字中咱們就能夠看出所謂單例,就是單個實例也就是說它能夠解決的問題是:能夠保證一個類在內存中的對象的惟一性,在一些經常使用的工具類、線程池、緩存,數據庫,帳戶登陸系統、配置文件等程序中可能只容許咱們建立一個對象,一方面若是建立多個對象可能引發程序的錯誤,另外一方面建立多個對象也形成資源的浪費。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"); } }