單例模式(一)
阿新 • • 發佈:2018-11-20
1,私有化構造器,私有一個例項物件,通過靜態方法,讓外部呼叫私有化的例項物件 /** * 懶漢式 * 單例的標準模式,使用判斷來進行延遲載入, * 使用synchronized關鍵字來避免多執行緒問題,但影響效能 */ class Singleton{ private static Singleton instance = null; private Singleton(){} public synchronized static Singleton GetSinsrance1(){ if(instance == null) return new Singleton(); return instance; } } /** * 餓漢式 * 在宣告物件的時候就開始初始化物件,但初始化比較負責,會導致程式緩慢 */ class Singleton1 { private static Singleton1 instance = new Singleton1(); private Singleton1(){}; public static Singleton1 GetInstance(){ return instance; } } /** *雙重加鎖機制,懶漢式的加強版 * 講synchronized放到例項化方法內,並使用volatile關鍵字修飾物件,既避免了多執行緒問題, * 又不會影響效能,但volatile本身有問題,少用 */ class Singleton2{ private static volatile Singleton2 instance = null; private Singleton2(){} public static Singleton2 GetInstance(){ if(instance == null){ synchronized (Singleton2.class){ if(instance == null) return new Singleton2(); } } return instance; } } /** * Lazy initialization holder class * 這裡建立了一個靜態類,使用內部類的機制使單例物件延遲載入,內部類相當是外部類的靜態部分, * 所以通過jvm來保證執行緒安全 */ class Singleton3{ private static class SingletonHolder{ private static Singleton3 instance = new Singleton3(); } private Singleton3(){} public static Singleton3 getInstance(){ return SingletonHolder.instance; } } /** * 單因素的列舉類,已經實現了單例 */ enum Singleton4{ sinleton; }