實現
使用單例,使用getInstance獲取對象實例而不用new創建新的實例
getInstance:做一個判斷,如果已經存在則直接獲取對象,不存在會new 一個對象
新建一個單例類,做判斷,如果該實例不存在則new 一個實例,如果存在則getInstance,然後return
分類
-
懶漢(用到了才new對象)
private static Singleton instance ;
-
餓漢(先new好,用到了直接使用)
private static Singleton instance = new Singleton();
-
線程安全(多線程環境不會繞過空判斷new多個)在null判斷處使用synchronized 保證
-
線程不安全(多線程環境可能繞過空判斷new多個)沒有鎖
上述有四種組合 懶安全 懶不安全 餓安全 餓不安全
- 雙重校驗鎖
private volatile static Singleton singleton;
做兩次實例null判斷
- 枚舉
public enum Singleton { INSTANCE; public void whateverMethod() { } }
- 靜態內部類
private static final Singleton INSTANCE = new Singleton();
業務
如sql連接實例,一個用戶維護一個連接,如果多次new 實例會造成一個用戶多個連接,此處可以用單例模式,保證只維護一個連接。